2016-07-01 4 views
1

Я получаю ошибку о том, чтоAndroid: NullPointerException при использовании ActionBar

java.lang.RuntimeException: Unable to start activity ComponentInfo{...}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity... 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null object reference at com.myapp.contactList.MainPage.onCreate(MainPage.java:41) 

И я посмотрел несколько переполнения стека вопросов, похожих на эту и перепробовал все решения, но до сих пор с этой проблемой. Ниже мой код:

MainPage.java

public class MainPage extends AppCompatActivity{ 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main_page); 

    android.support.v7.app.ActionBar ab = getSupportActionBar(); 
    assert ab != null; 
    ab.setDisplayHomeAsUpEnabled(true); // I'M GETTING THE ERROR HERE AT THIS LINE 
    ab.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#51c2f2"))); 
    ab.setDisplayUseLogoEnabled(true); 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.myapp.contactList"> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity 
     android:name=".MainPage" 
     android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 
</manifest> 

styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <!-- Customize your theme here. --> 
    <item name="colorPrimary">@color/colorPrimary</item> 
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
    <item name="colorAccent">@color/colorAccent</item> 
</style> 

activity_main_page.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context="com.myapp.contactList.MainPage"> 

    <android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/AppTheme.AppBarOverlay"> 
    </android.support.design.widget.AppBarLayout> 
    <include layout="@layout/content_main_page" /> 
</android.support.design.widget.CoordinatorLayout> 
+0

Вы уверены, что используете тему? Ошибка говорит «Использовать тему AppCompat». Но в опубликованном коде вы используете тему приложения compat –

+0

Я не уверен, понял ли я ваш комментарий. Ошибка говорит мне использовать тему AppCompat, и я использую тему AppCompat, так почему же эта ошибка возникает? –

+0

@someonenew проверить мой ответ –

ответ

1

В основном у вас есть две ошибки в коде:

Во-первых, assert ключевое слово не поддерживается Android, когда вы используете его в коде просто ничего не произойдет. Вы должны проверить, что этот код:

if(ab == null) { 
    throw new IllegalStateException(); 
} 

или вы можете также использовать

Assert.notNull(ab); 

из некоторой библиотеки или рамок.

Вы можете также включить утверждают, но только для вашего устройства с помощью ADB:

adb shell setprop debug.assert 1 

Во-вторых, вы должны использовать Toolbar в качестве бара поддержки действий. Обновите класс MainActivity

public class MainPage extends AppCompatActivity{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main_page); 
     android.support.v7.widget.Toolbar toolbar 
      = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar) 

     setSupportActionBar(toolbar) 
     android.support.v7.app.ActionBar ab = getSupportActionBar(); 
     ab.setDisplayHomeAsUpEnabled(true); 
     ... 

и обновление макета XML, как показано в коде ниже:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
    .... 
    tools:context="com.myapp.contactList.MainPage"> 

    <android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

     <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     app:popupTheme="@style/AppTheme.PopupOverlay" 
     android:layout_height="wrap_content" 
     android:background="?attr/colorPrimary" 
     android:theme="?attr/actionBarTheme" 
     android:minHeight="?attr/actionBarSize"> 

    </android.support.design.widget.AppBarLayout> 
    <include layout="@layout/content_main_page" /> 
</android.support.design.widget.CoordinatorLayout> 

Вы должны также установить стиль "@style/AppTheme.NoActionBar" для вашей деятельности

Вы можете определить его in style.xml, как приводится ниже:

<style name="AppTheme.NoActionBar"> 
    <item name="windowActionBar">false</item> 
    <item name="windowNoTitle">true</item> 
</style> 
+0

Я добавил, что statment и я получаю эту ошибку 'Caused by: java.lang.IllegalStateException: вам нужно использовать тему Theme.AppCompat (или потомок) с этим действием.« Поэтому я знаю, что это говорит мне об изменении темы на «AppCompat» 'но я уже использую' AppCompat', что я должен изменить? –

+0

перед вызовом getSupportActionBar() вы должны вызвать setSupportActionBar (панель инструментов). В противном случае вы всегда получите нуль –

+0

поместите панель инструментов в xml и в '' ' '' ' –

1

Я думаю вам нужно использовать setSupportActionBar, чтобы установить его первым.что-то вроде этого:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
} 

это расположение:

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.PopupOverlay" /> 

    </android.support.design.widget.AppBarLayout> 

и этот стиль в манифесте:

android:theme="@style/AppTheme.NoActionBar"> 

который удаляет ActionBar:

<style name="AppTheme.NoActionBar"> 
    <item name="windowActionBar">false</item> 
    <item name="windowNoTitle">true</item> 
</style> 

Я думаю, вы пытаетесь получить то, что не является SupportActionBar, так что это происходит.

Смежные вопросы