it-roy-ru.com

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

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

Метод выдает следующее сообщение об ошибке в 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();
            }
        });
    }

}
67
AJW

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

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

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

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

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

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

Прежде всего, вам нужно установить панель инструментов в качестве поддержки ActionBar . Затем, если вы уверены, что она будет там постоянно, просто установите ее как! = 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() в своей базовой Activity и добавил аннотацию @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();
    }
3
Catalin Morosan

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

2
Pankaj K Sharma

Я создал общий класс, такой как:

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.

2
interrupt
 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 AppCompatActivity на public class MainActivity extends AppCompatActivity

0
MEGHA DOBARIYA

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

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

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

0
saibhaskar

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

    setSupportActionBar(toolbar);

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

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

assert getSupportActionBar() != null;

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

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