Как исправить метод getActionBar может вызвать java.lang.NullPointerException
Я использую панель инструментов в качестве своего действия в действии. Я пытаюсь добавить метод getActionBar().setDisplayHomeAsUpEnabled(true);
в файл Activity.java для навигации вверх для старых устройств.
Этот метод вызывает следующее сообщение об ошибке в Android Studio:
Вызов метода может вызвать java.lang.NullPointerException
- Добавление вертикальной полосы прокрутки в AlertDialog в Android?
- Панель c # для рисования графики и прокрутки
- Изменение цвета фона отдельных элементов меню навигации
- Как установить текст панели инструментов и цвет стрелки назад
- Создание SearchView, который выглядит как руководство по разработке материалов
Навигация вверх на панели инструментов отлично работает на новых устройствах … теперь я пытаюсь понять, как убедиться, что он будет работать на более старых устройствах. Пожалуйста, порекомендуйте.
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(); } }); } }
- Цвет выбранной вкладки в нижней навигации
- Панель не получает фокус
- Как оживить Burger в Arrow с помощью Appcompat v7 21, панели инструментов и DrawerLayout
- Не удается уловить событие нажатия кнопки кнопки панели инструментов
- Контекстные стили Actionbar
- В каком порядке панели наиболее эффективны с точки зрения времени и производительности?
- как удалить тень под панелью действий с помощью AppCompat.Light.NoActionBar?
- self.title устанавливает заголовок navigationController и tabBarItem? Зачем?
На самом деле 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);