Подтвердить что ты не робот

Как исправить метод 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

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

}
4b9b3361

Ответ 1

На самом деле Android Studio не показывает вам сообщение об ошибке, это просто предупреждение.

Некоторые ответы предполагают использование утверждения, время выполнения Dalvik assertion отключено по умолчанию, поэтому вам нужно фактически включить его, чтобы он действительно что-то сделал. В этом случае (утверждение отключено), то, что вы по существу делаете, просто обманывает Android Studio, чтобы не показывать вам предупреждение. Кроме того, я предпочитаю не использовать "assert" в производственном коде.

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

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

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

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

Ответ 2

Сначала вы должны установить панель инструментов в качестве поддержки 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 getSupportActionBar() if you're using AppCompatActivity, not getActionBar()
}

Ответ 3

Спасибо Эндрю за ваш ответ. Если у вас есть Nav Drawer или что-то еще, использующее getSupportActionBar(), вам нужно добавить assert getSupportActionBar()!= Null;

Мир,

Пример:

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

Ответ 4

Попробуйте следующее:

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

Ответ 5

То, что я сделал, переопределяет метод getSupportActionBar() в моей базовой операции и добавляет аннотацию @NonNull. Таким образом, я получаю только одно предупреждение lint в базовом действии о том, как я использую аннотацию @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();
    }

Ответ 6

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

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);

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

Ответ 7

добавить assert getSupportActionBar() != null; до getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Ответ 8

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

Ответ 9

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

Ответ 10

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

assert getSupportActionBar() != null;

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

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

Ответ 11

Попробуй это:

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

Обратите внимание, что setSupportActionBar (панель инструментов) должна быть перед getSupportActionBar().

Ответ 12

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

Заменить MainActivity extends AppCompatActivity на public class MainActivity extends AppCompatActivity

Ответ 13

просто проверьте getSupportActionBar не равно нулю

    setSupportActionBar(toolbar);

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

Ответ 14

Если вы импортируете

android.app.ActionBar 

Вы должны использовать getActionBar()

и если вы импортируете

android.support.v7.app.ActionBar

используйте getSupportActionBar()

Ответ 15

У вас есть несколько вариантов сделать то, что вы просили:

1 - игнорировать предупреждение

Не нужно объяснять дальше, это не ошибка

2 - элегантное решение

Оберните свою строку выражением "if", чтобы убедиться, что оно не равно нулю

if(getSupportActionBar() != null) {
        getSupportActionBar().setTitle(getString(R.string.artist));
}

3 - использовать assert

assert getSupportActionBar() != null;
getSupportActionBar().setTitle(getString(R.string.artist));

4 - переместить предупреждение

Если вы используете 'getSupportActionBar' в нескольких местах, вы можете удалить все эти предупреждения, а взамен вы получите только предупреждение об использовании @NonNull.

@NonNull
@Override
public ActionBar getSupportActionBar() {
    return super.getSupportActionBar();
}