1

Я использую this как учебное пособие по реализации темы материала для существующего приложения на устройствах до Android 5.0. Моя проблема в том, что я получаю Null Pointer Exception каждый раз, когда я звоню getActionBar().something или getSupportActionBar().something.Проблема с реализацией материала Тема

Вот все, что я сделал для реализации Материальной темы.

В значениях/styles.xml

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

<!-- 
    Base application theme, dependent on API level. This theme is replaced 
    by AppBaseTheme from res/values-vXX/styles.xml on newer devices. 
--> 
<style name="AppTheme" parent="AppTheme.Base"/> 

<style name="AppTheme.Base" parent="Theme.AppCompat.Light"> 
    <item name="colorPrimary">#1A7E99</item> 
    <item name="colorPrimaryDark">#16657A</item> 
    <item name="android:windowNoTitle">true</item> 
    <item name="windowActionBar">false</item> 
</style> 

<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> 
    <item name="spinBars">true</item> 
    <item name="color">@android:color/white</item> 
</style> 

<!-- View pager progress indecator theme --> 
<style name="StyledIndicators" parent="AppBaseTheme"> 
    <item name="vpiCirclePageIndicatorStyle">@style/CustomCirclePageIndicator</item> 
</style> 

<style name="CustomCirclePageIndicator"> 
    <item name="fillColor">#ffffff</item> 
    <item name ="strokeWidth">2dp</item> 
    <item name ="strokeColor">#cfd3d4</item>    
    <item name="radius">8dp</item> 
    <item name="centered">true</item> 
</style> 

<style name="Widget"></style> 

<style name="Widget.FloatingHintEditText" parent="@android:style/Widget.EditText"> 
    <item name="android:paddingTop">0dp</item> 
</style> 

В моей ценности-v21/styles.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<style name="AppTheme" parent="AppTheme.Base"> 
    <item name="android:windowContentTransitions">true</item> 
    <item name="android:windowAllowEnterTransitionOverlap">true</item> 
    <item name="android:windowAllowReturnTransitionOverlap">true</item> 
    <item name="android:windowSharedElementEnterTransition">@android:transition/move</item> 
    <item name="android:windowSharedElementExitTransition">@android:transition/move</item> 
</style> 
</resources> 

Как я поставил windowActionBar к ложным, у меня есть панель инструментов раскладка.

toolbar.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="?attr/colorPrimary"/> 

И, наконец, на к MainActivity.java

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); 
     if (toolbar != null) { 
      setSupportActionBar(toolbar); 
     } 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); // NULL POINTER EXCEPTION here 
     getSupportActionBar().setHomeButtonEnabled(true); 

     // rest of my code 
    } 
} 

Я добавляю мою тему в манифесте:

android:theme="@style/AppTheme" 

Мой Logcat:

11-11 12:40:54.798: E/ResourceType(32738): Style contains key with bad entry: 0x01010479 
11-11 12:40:55.349: E/AndroidRuntime(32738): FATAL EXCEPTION: main 
11-11 12:40:55.349: E/AndroidRuntime(32738): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.driverdesignstudio.drvr/com.driverdesignstudio.drvr.MainActivity}: java.lang.NullPointerException 
11-11 12:40:55.349: E/AndroidRuntime(32738): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2343) 
11-11 12:40:55.349: E/AndroidRuntime(32738): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2395) 
11-11 12:40:55.349: E/AndroidRuntime(32738): at android.app.ActivityThread.access$600(ActivityThread.java:162) 
11-11 12:40:55.349: E/AndroidRuntime(32738): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364) 
11-11 12:40:55.349: E/AndroidRuntime(32738): at android.os.Handler.dispatchMessage(Handler.java:107) 
11-11 12:40:55.349: E/AndroidRuntime(32738): at android.os.Looper.loop(Looper.java:194) 
11-11 12:40:55.349: E/AndroidRuntime(32738): at android.app.ActivityThread.main(ActivityThread.java:5371) 
11-11 12:40:55.349: E/AndroidRuntime(32738): at java.lang.reflect.Method.invokeNative(Native Method) 
11-11 12:40:55.349: E/AndroidRuntime(32738): at java.lang.reflect.Method.invoke(Method.java:525) 
11-11 12:40:55.349: E/AndroidRuntime(32738): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 
11-11 12:40:55.349: E/AndroidRuntime(32738): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
11-11 12:40:55.349: E/AndroidRuntime(32738): at dalvik.system.NativeStart.main(Native Method) 
11-11 12:40:55.349: E/AndroidRuntime(32738): Caused by: java.lang.NullPointerException 
11-11 12:40:55.349: E/AndroidRuntime(32738): at com.driverdesignstudio.drvr.MainActivity.onCreate(MainActivity.java:123) 
11-11 12:40:55.349: E/AndroidRuntime(32738): at android.app.Activity.performCreate(Activity.java:5122) 
11-11 12:40:55.349: E/AndroidRuntime(32738): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081) 
11-11 12:40:55.349: E/AndroidRuntime(32738): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307) 
11-11 12:40:55.349: E/AndroidRuntime(32738): ... 11 more 

Мои вопросы:

  • Почему я получаю исключение нулевого указателя для getActionBar(), когда я добавляю мое расположение панелей инструментов к MainActivity?
  • Как добавить тему материала в мое приложение.

Cheers, Ракшак

+0

Вы используете Gradle Build в Android Studio или Eclipse ADT? – HpTerm

+0

Eclipse ADT и я включил библиотеку AppCompacy. – DrkStr

+1

Да, я уверен. Я установил «windowActionBar» в true в моей теме и закомментировал материал панели инструментов, и приложение работает нормально. Я даже получаю полосы меню для анимации стрелок, которая является частью библиотеки AppCompact. – DrkStr

ответ

4

UPDATE: действительная проблема заключается в том, что у вас есть <android.support.v7.widget.Toolbar код в собственном toolbar.xml файле. это должно быть в activity_main.xml и всех других макетах, которые вы хотите использовать с панелью действий.


Панель инструментов позволяет настраивать больше, чем ActionBar по умолчанию (в основном связанный с внешним видом). Если вам нужно или нужно настроить панель действий, вам необходимо установить панель инструментов как ActionBar. Если не. вам не нужно это делать, и вы можете просто использовать ActionBar по умолчанию, предоставленный Theme (вам нужно удалить фальшивую часть windowActionBar из вашей темы).

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

<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="?attr/colorPrimaryDark"/> 

Тогда вы можете использовать свой код.

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


OLD ОТВЕТ НИЖЕ


Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
if (toolbar != null) { 
    setSupportActionBar(toolbar); 
} 
getSupportActionBar().setDisplayHomeAsUpEnabled(true); // NULL POINTER EXCEPTION here 
getSupportActionBar().setHomeButtonEnabled(true); 

вы только установить панель инструментов, если вид был найден. кажется, что точка зрения не найдена.

после того, как вы получили доступ к панели действий, которая не была установлена, и поэтому она равна нулю.

также у вас есть <item name="windowActionBar">false</item>, который отключает панель действий по умолчанию.

вы можете сделать следующее:

  • установить windowActionbar к истинно в вашей теме, то у вас есть ActionBar по умолчанию, и вы не будете нуждаться в панели инструментов.
  • , если вы хотите использовать панель инструментов на не местоположение по умолчанию, вы должны убедиться, что findViewById(R.id.toolbar) фактически возвращает панель инструментов (проверьте свои макеты, которые есть панель инструментов с этим идентификатором)
  • или не использовать getSupportActionBar без проверки его ноль.
+0

см. Мой второй пункт. – Dodge

+0

также панель действий, предоставляемая windowActionBar, представляет собой панель инструментов. просто чтобы вы не позаботились об этом. – Dodge

+2

хорошо, я не знаю, почему в учебнике говорится, что нужно удалить windowActionBar. вам нужно только сделать это, если вы хотите настроить положение или размер. если вы хотите использовать его как простую панель действий, например, до 5.0, вам не нужно ее удалять. – Dodge