2015-02-23 2 views
1

Я попытался переключиться с ActionBar на Панели инструментов, потому что я хотел применить новый дизайн Material.setSupportActionBar() всегда вызывает NullPointerException

Неудачный мой подход не сработал, и setSupportActionBar() всегда вызывает исключение NullPointerException.

Библиотека appcompat включена в качестве проекта библиотеки, а также зависит от параметров проекта.

Любые предложения?

манифеста:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.myApp" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="15" 
     android:targetSdkVersion="21" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".view.screens.MainActivity" 
      android:configChanges="keyboardHidden|orientation|screenSize" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="android.intent.action.SEARCH" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

styles.xml

<resources xmlns:android="http://schemas.android.com/apk/res/android"> 

    <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar"> 
     <item name="colorPrimary">@color/ktbl_red</item> 
     <item name="colorPrimaryDark">@color/ktbl_green</item> 
     <item name="colorAccent">@color/ktbl_yellow</item> 

     <item name="android:windowNoTitle">true</item> 
     <item name="windowActionBar">false</item> 
     <item name="windowActionModeOverlay">true</item> 

     <item name="toolbarStyle">@style/Widget.AppCompat.Toolbar</item> 
    </style> 

    <style name="AppTheme" parent="AppTheme.Base"> 
    </style> 

toolbar.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:minHeight="?attr/actionBarSize" 
    android:background="@color/ktbl_blue" 
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"> 
</android.support.v7.widget.Toolbar> 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<merge> 
    <include layout="@layout/toolbar" /> 
</merge> 

MainActivity

public class MainActivity extends ActionBarActivity{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main);; 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); // error (NPE) 
    } 

    /* ... */ 
} 

NullPointerExecption

02-23 14:21:38.564 3687-3687/com.example.myApp E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myApp/com.example.myApp.view.screens.MainActivity}: java.lang.NullPointerException 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
      at android.app.ActivityThread.access$600(ActivityThread.java:123) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4424) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.NullPointerException 
      at android.support.v7.internal.widget.ToolbarWidgetWrapper.<init>(ToolbarWidgetWrapper.java:95) 
      at android.support.v7.internal.widget.ToolbarWidgetWrapper.<init>(ToolbarWidgetWrapper.java:88) 
      at android.support.v7.internal.app.ToolbarActionBar.<init>(ToolbarActionBar.java:84) 
      at android.support.v7.app.ActionBarActivityDelegateBase.setSupportActionBar(ActionBarActivityDelegateBase.java:175) 
      at android.support.v7.app.ActionBarActivity.setSupportActionBar(ActionBarActivity.java:92) 
      at de.ktbl.com.example.myApp.MainActivity.onCreate(MainActivity.java:33) 
      at android.app.Activity.performCreate(Activity.java:4465) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
            at android.app.ActivityThread.access$600(ActivityThread.java:123) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:4424) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:511) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
            at dalvik.system.NativeStart.main(Native Method) 
+0

является 'toolbar' нуль? – Blackbelt

+0

В 'activity_main.xml' вы не должны использовать тег' '. Поместите там LinearLayout или RelativeLayout. – skywall

+0

Что такое строка 33 в «MainActivity»? – Josef

ответ

0

Попробуйте использовать, как это, надеюсь, это будет удалить NPE ...

ActionBar actionBar = getSupportActionBar(); // or getActionBar(); 
    actionBar.setDisplayShowHomeEnabled(true); 
    actionBar.setDisplayUseLogoEnabled(true); 

Надеется, что это помогает .... :)

+0

Я заявил об этом выше в разделе «Панель инструментов», и теперь я получаю NPE для «actionBar.setDisplayShowHomeEnabled (true);» (я импортировал панель действий поддержки) – Kody

+0

ok попробуйте дать панели действий заголовок или присвоить логотип таким образом actionBar.setLogo (R.drawable.abc); actionBar.setTitle (getTitle()); */ – Umair

+0

Я попробовал оба. Всегда NPE :( – Kody

0

Это происходит, когда объект неизвестен или имеет значение null. Это может произойти, когда вы забыли установить объект, исходная библиотека неизвестна (не может быть найдена) или вы используете неправильный тип использования.

На каком устройстве вы протестировали это приложение? ниже, чем API 15? Попробуйте проверить поддержку библиотеки

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

-1) FIX ваш файл манифеста (вы забыли метки конца деятельности)

<application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".view.screens.MainActivity" 
      android:configChanges="keyboardHidden|orientation|screenSize" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="android.intent.action.SEARCH" /> 
      </intent-filter> 
     </activity> 
</application> 

ваш Java-код:

public class MainActivity extends ActionBarActivity{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); // error (NPE) 

     setContentView(R.layout.activity_main); //set view at end 
    } 

    /* ... */ 
} 
+0

Я использовал устройство/эмулятор API15. Библиотека поддержки, кажется, включена правильно, я мог бы создать проект, а также элементы поддержки/xml. '' находится в манифесте. Я подготовил код здесь .. (Не хотел публиковать полный манифест с ~ 100 строк. Я исправлю это в вопросе. – Kody

+0

В google я видел этот пример: http://developer.android.com/ training/improvement-layouts/reusing-layouts.html. Попробуйте ввести этот код в свой основной вид деятельности user3309567

+1

Btw ... настройка представления содержимого после неправильной настройки панели инструментов -> https://chris.banes.me/2014/10/17/appcompat-v21/ – Kody

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