Android support-v7-appcompat在4.0及以上版本中存在问题

6

我正在将我的Android应用程序进行回溯以支持旧设备(2.3.3+)。之前,它是4.0+。

我正在使用ActionBar并在基类中的代码上进行自定义样式。转换为Support ActionBar后,样式代码如下:

public static void styleActionBar(final ActionBarActivity activity) {
    /* Setup the actionbar as required */
    final ActionBar actionBar = activity.getSupportActionBar();

    if (actionBar != null) {
        actionBar.setBackgroundDrawable(new ColorDrawable(0xfffffff));
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        actionBar.setCustomView(R.layout.customview_actionbar);

        ....
    }
}

在这个更改之后,所有的东西都在2.3.3上完美运行。但是,在4.0+上,它在这一行崩溃了。

        actionBar.setBackgroundDrawable(new ColorDrawable(0xfffffff));

另外,如果我注释掉这一行,我可以看到它也会在actionBar.setCustomView处崩溃。

4.2上的堆栈跟踪:

....
Caused by: java.lang.NullPointerException
    at android.support.v7.app.ActionBarImplICS.setBackgroundDrawable(ActionBarImplICS.java:176)
    at com.mycompany.myproj.ProjBaseActivity.styleActionBar(ProjBaseActivity.java:68)
    at com.mycompany.myproj.ProjBaseActivity.onCreate(ProjBaseActivity.java:32)
    at com.mycompany.myproj.TextSearchActivity.onCreate(TextSearchActivity.java:60)
    at android.app.Activity.performCreate(Activity.java:5008)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2139)

它在2.3.3中完美运行,但我认为这是support-v7-appcompat的问题。

有没有任何线索/帮助来克服或解决这个问题?提前感谢。

编辑1:values-v14/styles.xml内容:

<resources>

  <style name="MyTheme" parent="@style/Theme.AppCompat.Light">
    <item name="android:actionBarStyle">@style/MyTheme.ActionBarStyle</item>
  </style>

  <style name="MyTheme.ActionBarStyle" parent="@style/Widget.AppCompat.Light.ActionBar">
    <item name="android:titleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item>
  </style>

  <style name="MyTheme.ActionBar.TitleTextStyle" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title">
    <item name="android:textColor">@color/proj_theme_color</item>
  </style>

</resources>

你是在什么时候调用那个方法的? - user
在活动的 onCreate() 方法中,在调用 super.onCreate() 之后。 - Shameem
非常抱歉之前的问题,从堆栈跟踪来看很明显了。你每个API级别都有不同的主题(如values-v14等)吗?某些主题没有ActionBar(比如基于对话框的主题)。 - user
1个回答

0

如果你正在使用AppCompat v7,需要调用SupportActionBar而不是ActionBar。

 final **SupportActionBar** actionBar = activity.getSupportActionBar();

if (actionBar != null) {
    actionBar.setBackgroundDrawable(new ColorDrawable(0xfffffff));
    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
    actionBar.setCustomView(R.layout.customview_actionbar);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接