Как исправить метод getActionBar может вызвать java.lang.NullPointerException

Я использую панель инструментов в качестве своего действия в действии. Я пытаюсь добавить метод getActionBar().setDisplayHomeAsUpEnabled(true); в файл Activity.java для навигации вверх для старых устройств.

Этот метод вызывает следующее сообщение об ошибке в Android Studio:

Вызов метода может вызвать java.lang.NullPointerException

Навигация вверх на панели инструментов отлично работает на новых устройствах … теперь я пытаюсь понять, как убедиться, что он будет работать на более старых устройствах. Пожалуйста, порекомендуйте.

From build.gradle:

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

Из AndroidManifest.xml:

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

Из styles.xml

  true false true 

от 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 по умолчанию отключено утверждение , поэтому вы должны фактически включить его, чтобы он действительно что-то делал. В этом случае (утверждение отключено), то, что вы по существу делаете, просто обманывает Android Studio, чтобы не показывать вам предупреждение. Кроме того, я предпочитаю не использовать «assert» в производственном коде.

На мой взгляд, то, что вы должны делать, очень просто.

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

Обновление. Если вы используете версию библиотеки поддержки панели действий, вы должны заменить getActionBar () на getSupportActionBar ().

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

Во-первых, вам нужно установить панель инструментов в качестве поддержки ActionBar. Тогда, если вы уверены, что он будет там все время, просто утвердите его как! = 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 . Таким образом, я получаю только одно предупреждение lint в базовом @NonNull о том, как я использую аннотацию @NonNull для чего-то, что имеет @Nullable аннотацию.

  @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(); } 

add assert getSupportActionBar() != null; перед getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Я создал общий class, например:

 public final class Cast { private Cast() {} /** * Helps to eliminate annoying NullPointerException lint warning. */ @android.support.annotation.NonNull public static  T neverNull(T value) { return value; } } 

то я могу использовать его для любого вызова с предупреждением NullPointerException, для которого я уверен, что этого никогда не произойдет, например

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

PS не забудьте добавить «com.android.support:support-annotations» в ваш файл gradle.

  if(actionBar != null) { actionBar.setHomeButtonEnabled(true); actionBar.setBackgroundDrawable(ContextCompat.getDrawable(mContext, R.drawable.action_bar_gradient)); } 

используйте эту тему: 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); 

В качестве альтернативы вы можете утверждать, что панель действий не имеет значения null.Добавьте утверждение перед вызовом панели действий следующим образом

 assert getSupportActionBar() != null; 

Поэтому окончательный fragment выглядит следующим образом:

  setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); assert getSupportActionBar() != null; getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
  • Изменить размер для строки состояния вызова?
  • В каком порядке панели наиболее эффективны с точки зрения времени и производительности?
  • Как скрыть строку состояния iOS
  • Изменение цвета фона отдельных элементов меню навигации
  • Не удается уловить событие нажатия кнопки кнопки панели инструментов
  • Создание SearchView, который выглядит как руководство по разработке материалов
  • Панель навигации под панелью инструментов
  • c: forEach внутри перьев (например, p: panelgrid) внутри ui: repeat
  • Давайте будем гением компьютера.