web-dev-qa-db-ja.com

getActionBarメソッドを修正してJava.lang.NullPointerExceptionを生成する方法

アクティビティのアクションバーとしてツールバーを使用しています。古いデバイスのUpナビゲーションのために、Activity.JavaファイルにgetActionBar().setDisplayHomeAsUpEnabled(true);メソッドを追加しようとしています。

このメソッドは、Android St​​udioで次のエラーメッセージを生成します。

メソッドの呼び出しによりJava.lang.NullPointerExceptionが生成される場合があります

ツールバーの[上へ]ナビゲーションは、新しいデバイスで正常に機能します...今、古いデバイスで機能することを確認する方法を見つけようとしています。お知らせ下さい。

Build.gradleから:

dependencies {
   compile "com.Android.support:appcompat-v7:22.1.0"
}

AndroidManifest.xmlから:

Android:theme="@style/Theme.AppCompat.NoActionBar.FullScreen" 

Styles.xmlから

<style name="Theme.AppCompat.NoActionBar.FullScreen" parent="AppTheme">
<item name="Android:windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="Android:windowFullscreen">true</item>

activity.Javaから

public class CardViewActivity extends AppCompatActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.cardviewinput);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

    if (toolbar != null) {
        // Up navigation to the parent activity for 4.0 and earlier
        getActionBar().setDisplayHomeAsUpEnabled(true);
        toolbar.setNavigationIcon(R.drawable.ic_action_previous_item);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
    }

}
72
AJW

実際、Android St​​udioは「エラーメッセージ」を表示せず、単なる警告です。

いくつかの答えは、アサーションの使用を提案します。Dalvikランタイムは assertion がデフォルトでオフになっているため、実際に何かを実行するには、実際にオンにする必要があります。この場合(アサーションはオフになっています)、基本的には、Android St​​udioをだまして警告を表示しないようにします。また、私は生産コードで「アサート」を使用しないことを好みます。

私の意見では、あなたがすべきことは非常に簡単です。

if(getActionBar() != null){
   getActionBar().setDisplayHomeAsUpEnabled(true);
}

更新:アクションバーのサポートライブラリバージョンを使用している場合は、getActionBar()をgetSupportActionBar()に置き換える必要があります。

if(getSupportActionBar() != null){
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
122
Adam Ghani

最初に、ツールバーをサポートActionBarとして設定する必要があります。次に、常に存在することが確実な場合は、!= nullとしてアサートします。これにより、コンパイラーはnullにならないので、nullチェックに合格します。

@Override
protected void onCreate(Bundle savedInstanceState)
{
   super.onCreate(savedInstanceState);
   setContentView(R.layout.cardviewinput);

   Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
   setSupportActionBar(toolbar);

   assert getSupportActionBar() != null;
   getSupportActionBar().setDisplayHomeAsUpEnabled(true); // it's getSupportActionBar() if you're using AppCompatActivity, not getActionBar()
}
34
Bogdan Zurac

あなたの答えをありがとうアンドリュー。 Nav DrawerまたはgetSupportActionBar()を使用する何かがある場合は、assert getSupportActionBar()!= null;を追加する必要があります。

平和、

例:

@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    assert getSupportActionBar() != null;
    getSupportActionBar().setTitle(mTitle);
}
8
Scott

これを試して :

private ActionBar getActionBar() {
    return ((AppCompatActivity) getActivity()).getSupportActionBar();
}
4
Shubham A.

私がやったことは、基本アクティビティのgetSupportActionBar()メソッドをオーバーライドし、@NonNullアノテーションを追加することです。このように、@NonNullアノテーションを持つものに対して@Nullableアノテーションを使用する方法について、ベースアクティビティで1つのリント警告のみを取得します。

    @NonNull
    @Override
    public ActionBar getSupportActionBar() {
        // Small hack here so that Lint does not warn me in every single activity about null
        // action bar
        return super.getSupportActionBar();
    }
3
Catalin Morosan

次のような汎用クラスを作成しました。

public final class Cast
{
    private Cast() {}

    /**
     * Helps to eliminate annoying NullPointerException lint warning.
     */
    @Android.support.annotation.NonNull
    public static <T> T neverNull(T value)
    {
        return value;
    }
}

その後、NullPointerException警告が発生した呼び出しでそれを使用することができます。

final ActionBar actionBar = Cast.neverNull(getSupportActionBar());
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);

追伸「com.Android.support:support-annotations」をgradleファイルに追加することを忘れないでください。

3
interrupt

assert getSupportActionBar() != null;の前にgetSupportActionBar().setDisplayHomeAsUpEnabled(true);を追加します

2
Pankaj K Sharma
 if(actionBar != null) {
  actionBar.setHomeButtonEnabled(true);
  actionBar.setBackgroundDrawable(ContextCompat.getDrawable(mContext,
                                  R.drawable.action_bar_gradient));
 }
0
Krishna

インポートする場合

Android.app.ActionBar 

getActionBar()を使用する必要があります

インポートする場合

Android.support.v7.app.ActionBar

getSupportActionBar()を使用します

0
MN. Vala

このテーマを使用:Android:theme="@style/Theme.AppCompat.Light.NoActionBar"

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("Title");
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_action_previous_item);
actionBar.setDisplayHomeAsUpEnabled(true);
0
Surendran
  if(getSupportActionBar() != null){
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
    OR

MainActivity extends AppCompatActivitypublic class MainActivity extends AppCompatActivityに置き換えます

0
MEGHA DOBARIYA

これを試して :

setSupportActionBar (toolbar);
if(getSupportActionBar () != null) {
assert getSupportActionBar () != null;
getSupportActionBar ().setDisplayHomeUpEnabled(true);
}

SetSupportActionBar(toolbar)はgetSupportActionBar()の前にあることに注意してください。

0
saibhaskar

null以外のgetSupportActionBarを確認してください

    setSupportActionBar(toolbar);

    if(getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle("Daily Shopping List");
    }
0
Salahuddin

または、アクションバーをnull以外にアサートすることもできます。次のようにアクションバーを呼び出す前にアサーションを追加します

assert getSupportActionBar() != null;

したがって、最終スニペットは次のようになります。

    setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
    assert getSupportActionBar() != null;
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
0
RileyManda