【问题标题】:Trouble implementing Material Theme难以实现材料主题
【发布时间】:2014-11-11 07:00:00
【问题描述】:

我正在使用this 作为教程,在 Android 5.0 之前的设备上将 Material Theme 应用到现有应用。我的问题是每次我打电话给getActionBar().somethinggetSupportActionBar().something 时都会收到Null Pointer Exception

这是我为实现 Material Theme 所做的一切。

在 values/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 设置为 false,因此我有一个工具栏布局。

工具栏.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
    }
}

我在 Manifest 中添加我的主题:

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

我的问题:

  • 为什么当我将工具栏布局添加到 MainActivity 时,getActionBar() 会出现空指针异常?
  • 如何将材料设计主题添加到我的应用程序中。

干杯, 拉克沙克

【问题讨论】:

  • 你是在 Android Studio 还是 Eclipse ADT 中使用 Gradle Build ?
  • Eclipse ADT 和我已经包含了 AppCompacy 库。
  • 是的,我很确定。我在我的主题中将“windowActionBar”设置为 true,并注释掉了工具栏的内容,应用程序运行良好。我什至将菜单栏添加到 AppCompact 库中的箭头动画。
  • 好的,这不是重点。 @Dodge 似乎是在正确的道路上解决你的答案。

标签: android android-actionbar material-design material-theme


【解决方案1】:

更新:您的实际问题是您在自己的 toolbar.xml 文件中有 &lt;android.support.v7.widget.Toolbar 代码。这必须在 activity_main.xml 以及您想与操作栏一起使用的所有其他布局中。


工具栏允许比默认操作栏更多的自定义(主要与外观相关)。如果你想或者需要自定义actionbar,你需要设置一个Toolbar作为ActionBar。如果不。你不需要这样做,你可以简单地使用 Theme 提供的默认 ActionBar(你必须从你的主题中删除 windowActionBar false 部分)。

如果你想使用工具栏,你必须确保你的布局中有一个工具栏视图。

<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。以防布局缺少工具栏。


下面是旧答案


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

只有在找到视图时才设置工具栏。好像没找到视图。

如果您访问尚未设置并因此为空的操作栏。

你也有 &lt;item name="windowActionBar"&gt;false&lt;/item&gt; 禁用默认操作栏。

您可以执行以下操作:

  • 在您的主题中将 windowActionbar 设置为 true,然后您将拥有默认操作栏,并且您不需要工具栏。
  • 如果您想在非默认位置使用工具栏,您必须确保 findViewById(R.id.toolbar) 实际上返回一个工具栏(检查您的布局是否存在具有该 ID 的工具栏)
  • 或者在未测试 null 的情况下不要使用 getSupportActionBar。

【讨论】:

  • 好吧,我不知道为什么教程声明要删除 windowActionBar。如果您想自定义位置或大小,您只需要这样做。如果您想将其用作 5.0 之前的简单操作栏,则无需将其删除。
  • 也可以将其删除,只需使用 Theme.AppCompat.NoActionBar 主题作为父主题。
  • 好吧。我认为教程是这样说的,因为工具栏允许在需要时进行更多自定义。事实是。如果要将 Toolbar 实例用作 ActionBar,则只需禁用 windowActionBar。但又一次。如果操作想要禁用操作栏。他必须确保工具栏视图出现在他的布局中。为了避免 NPe 不存在,他必须在使用前对 getSupportActionBar 进行空检查。
  • 我将主题中的“windowActionBar”元素设置为true,并从我的代码中注释掉了工具栏的内容,它工作正常。Yayayyaya :D 你们能想出找不到工具栏的原因吗通过我的应用程序?我肯定有它的布局。
  • 对不起,我删除了它们太晚了。考虑验证@Dodge 的答案作为接受的答案,并为他+1。
猜你喜欢
  • 2019-06-15
  • 1970-01-01
  • 2014-07-14
  • 2019-02-28
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多