2014-02-19 60 views
1

我有一個應用程序,目前在Android版本4.x和更多。 我想改變它,以便可以使用較舊的設備,如2.x和更多。 除了操作欄之外,一切正常。每次我嘗試getSupportActionBar時,我都會收到一個空指針異常。這是在論壇上討論過的很多問題,但我仍然無法解決。Android - 在較老的設備上使用AppCompat/ActionBar(java.lang.NullPointerException)

該應用程序使用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); 


    } 
    } 

回答

0

你不應該試圖實例化的Android這樣的活動:

notActionBar nab = new notActionBar(); 

的方式開始活動Android是與startActivity(Intent intent)或startActivityForResult方法。

但無論如何,您的問題的解決方案應該擴展ActionBarActivity而不是FragmentActivity在您的主要活動。

可以如果你使用碎片,也可以這樣做!因爲ActionBarActivity extends FragmentActivity。他們的

看到related answer here

+0

非常感謝。因爲我認爲Action bar活動沒有擴展Fragments,所以我在做內部類的所有工作。它工作正常,現在我正在從oncreate方法獲取操作欄。 – user3328051

+0

酷!我很高興,這對你有效:-) – donfuxx

0

你也應該考慮使用僅getSupportActionBar()或getActionBar()的任何一個。由於您希望定位較早的版本,因此只能使用getSupportActionBar()並從您的代碼中移除所有關於getActionBar()的引用。

Action Bar的完整指南是here.

+0

感謝您的信息!我認爲支持只對舊版本有用!你救了我一些代碼行! – user3328051

相關問題