アクティビティのアクションバーとしてツールバーを使用しています。古いデバイスのUpナビゲーションのために、Activity.JavaファイルにgetActionBar().setDisplayHomeAsUpEnabled(true);
メソッドを追加しようとしています。
このメソッドは、Android Studioで次のエラーメッセージを生成します。
メソッドの呼び出しにより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();
}
});
}
}
実際、Android Studioは「エラーメッセージ」を表示せず、単なる警告です。
いくつかの答えは、アサーションの使用を提案します。Dalvikランタイムは assertion がデフォルトでオフになっているため、実際に何かを実行するには、実際にオンにする必要があります。この場合(アサーションはオフになっています)、基本的には、Android Studioをだまして警告を表示しないようにします。また、私は生産コードで「アサート」を使用しないことを好みます。
私の意見では、あなたがすべきことは非常に簡単です。
if(getActionBar() != null){
getActionBar().setDisplayHomeAsUpEnabled(true);
}
更新:アクションバーのサポートライブラリバージョンを使用している場合は、getActionBar()をgetSupportActionBar()に置き換える必要があります。
if(getSupportActionBar() != null){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
最初に、ツールバーをサポート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()
}
あなたの答えをありがとうアンドリュー。 Nav DrawerまたはgetSupportActionBar()を使用する何かがある場合は、assert getSupportActionBar()!= null;を追加する必要があります。
平和、
例:
@Override
public void setTitle(CharSequence title) {
mTitle = title;
assert getSupportActionBar() != null;
getSupportActionBar().setTitle(mTitle);
}
これを試して :
private ActionBar getActionBar() {
return ((AppCompatActivity) getActivity()).getSupportActionBar();
}
私がやったことは、基本アクティビティの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();
}
次のような汎用クラスを作成しました。
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ファイルに追加することを忘れないでください。
assert getSupportActionBar() != null;
の前にgetSupportActionBar().setDisplayHomeAsUpEnabled(true);
を追加します
if(actionBar != null) {
actionBar.setHomeButtonEnabled(true);
actionBar.setBackgroundDrawable(ContextCompat.getDrawable(mContext,
R.drawable.action_bar_gradient));
}
インポートする場合
Android.app.ActionBar
getActionBar()を使用する必要があります
インポートする場合
Android.support.v7.app.ActionBar
getSupportActionBar()を使用します
このテーマを使用: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);
if(getSupportActionBar() != null){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
OR
MainActivity extends AppCompatActivity
をpublic class MainActivity extends AppCompatActivity
に置き換えます
これを試して :
setSupportActionBar (toolbar);
if(getSupportActionBar () != null) {
assert getSupportActionBar () != null;
getSupportActionBar ().setDisplayHomeUpEnabled(true);
}
SetSupportActionBar(toolbar)はgetSupportActionBar()の前にあることに注意してください。
null以外のgetSupportActionBarを確認してください
setSupportActionBar(toolbar);
if(getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("Daily Shopping List");
}
または、アクションバーをnull以外にアサートすることもできます。次のようにアクションバーを呼び出す前にアサーションを追加します
assert getSupportActionBar() != null;
したがって、最終スニペットは次のようになります。
setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
assert getSupportActionBar() != null;
getSupportActionBar().setDisplayHomeAsUpEnabled(true);