Android - 为旧设备使用AppCompat / ActionBar(java.lang.NullPointerException)

时间:2014-02-19 12:53:39

标签: android android-actionbar android-appcompat android-version

我有一个应用程序,目前适用于Android 4.x及更高版本。 我正在尝试更改它,以便它可以被2.x等更旧的设备使用。 除了动作栏,一切都很好。每次我尝试getSupportActionBar时,我都会收到一个空指针异常。这是我在论坛上讨论过很多的问题,但我仍然无法解决。

该应用程序使用appCompat库,但它似乎不适用于旧设备。

styles.xml文件

 <style name="AppBaseTheme" parent="Theme.MyApp">
    <item name="android:spinnerItemStyle">@style/SpinnerItem</item>
    <item name="android:spinnerDropDownItemStyle">@style/SpinnerItem.DropDownItem</item>
    <item name="android:windowNoTitle">true</item>
 </style>

MyApp.xml文件

<style name="Theme.MyApp" parent="@style/Theme.AppCompat">
      <item name="actionBarItemBackground">@drawable/selectable_background</item>
      <item name="popupMenuStyle">@style/PopupMenu.MyApp</item>
      <item name="dropDownListViewStyle">@style/DropDownListView.MyApp</item>
      <item name="actionBarTabStyle">@style/ActionBarTabStyle.MyApp</item>
      <item name="actionDropDownStyle">@style/DropDownNav.MyApp</item>
      <item name="actionBarStyle">@style/ActionBar.Transparent.MyApp</item>
      <item name="actionModeBackground">@drawable/cab_background_top</item>
      <item name="actionModeSplitBackground">@drawable/cab_background_bottom</item>
      <item name="actionModeCloseButtonStyle">@style/ActionButton.CloseMode.MyApp</item>

尝试获取操作栏的活动

  protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_auction_list);



    if (android.os.Build.VERSION.SDK_INT >=11)
    {
        getActionBar().setIcon(R.drawable.gem);
        getActionBar().setDisplayHomeAsUpEnabled(false);
        this.getActionBar().setDisplayShowCustomEnabled(true);
        this.getActionBar().setDisplayShowTitleEnabled(false);

        LayoutInflater inflator = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflator.inflate(R.layout.actionbar_title, null);

        ((CFTextView)v.findViewById(R.id.actionbarTitle)).setText(this.getTitle());

        //assign the view to the actionbar
        this.getActionBar().setCustomView(v);
    }
   else
  {
//This calls a private class inside the same class to get a supported action bar
           notActionBar nab = new notActionBar();
           nab.getNotActionBar(); //THIS IS THE ERROR LINE


}

获取受支持的操作栏的私有类。我使用了一个私有类而不是直接获取操作栏,因为我无法扩展ActionBarActivity,因为所有准备好的活动都会扩展片段。

private class notActionBar extends ActionBarActivity {
    public void getNotActionBar(){
        ActionBar actionBar = getSupportActionBar(); //NULL POINTER EXCEPTION
        actionBar.setIcon(R.drawable.gem);
        actionBar.setDisplayHomeAsUpEnabled(false);
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        actionBar.setDisplayShowCustomEnabled(true);
        this.getSupportActionBar().setDisplayShowCustomEnabled(true);
        this.getSupportActionBar().setDisplayShowTitleEnabled(false);

        LayoutInflater inflator = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflator.inflate(R.layout.actionbar_title, null);

        ((CFTextView)v.findViewById(R.id.actionbarTitle)).setText(this.getTitle());

        //assign the view to the actionbar
        this.getSupportActionBar().setCustomView(v);

 }

    public void setTitleActionBar(String a){

        getSupportActionBar().setTitle(a);


    }
    }

2 个答案:

答案 0 :(得分:0)

你不应该尝试在Android中实例化这样的活动:

notActionBar nab = new notActionBar();

在Android中启动活动的方法是使用startActivity(Intent intent)或startActivityForResult方法。

但无论如何,您的问题的解决方案应该是在您的主要活动中扩展ActionBarActivity而不是FragmentActivity

如果您使用碎片, 也可以执行此操作!因为ActionBarActivity extends FragmentActivity

请参阅related answer here

答案 1 :(得分:0)

您还应该考虑仅使用getSupportActionBar()或getActionBar()中的任何一个。由于您想要定位早期版本,请仅使用getSupportActionBar()并从代码中删除对getActionBar()的所有引用。

行动栏的完整指南是here.