1. 程式人生 > >Android中獲取ActionBar為null的問題

Android中獲取ActionBar為null的問題

由於ActionBar是在android3.0以後引入的,所以必然出現相容的問題。有時候我們在獲取ActionCar的時候出現空指標問題。如果工程是要相容3.0以下的版本(Activity 繼承AppCompatActivity),那麼要import以下:

import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
在onCraete中:
ActionBar actionBar = getSupportActionBar();

可以在頂部的ActionBar新增選單:

@Override
    public boolean onCreateOptionsMenu(Menu menu){
        MenuInflater inflater = new MenuInflater(this);
        inflater.inflate(R.menu.main_menu,menu);
        return super.onCreateOptionsMenu(menu);
    }
在AnroidManifest.xml檔案中新增:
<uses-sdk
            android:minSdkVersion = "11"
            android:targetSdkVersion = "16" />
在底部會新增ActionBar,也可以響應onCreateOptionsMenu建立的選單。
當然,也許還有其他問題,網路上別人總結的(http://blog.csdn.net/zhufuing/article/details/47105965),可以參考:
  1. 檢查你的應用是否設定了沒有 ActionBar 的主題Theme,或者直接設定了 NoActionBar或NoTitleBar 屬性,主要要檢查這幾點:檢查 AndroidManifest.xml 中的 標籤中的theme
    屬性,然後檢查各個 Activity 標籤中是否有不同的 Theme 導致這個介面的 ActionBar 無法顯示,@android:style/Theme.NoTitleBar<item name="windowActionBar">false</item> 
    <item name="android:windowNoTitle">true</item>
    這樣的屬性都會使應用中的 ActionBar消失,切記,如果你要使用ActionBar,則一定要清除掉這些Theme屬性設定,如果你的專案中 res 目錄下除了 values 目錄外,還有其他的res/values-v11,style/values-v14等,則這些目錄中的 styles.xml 都需要檢查一下,最後再檢查下 Activity 程式碼中是否動態設定了全屏或者不顯示TitleBar,程式碼如下: 
    //requestWindowFeature(Window.FEATURE_NO_TITLE); 
    //getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    上面的兩句程式碼,上面一句設定Activity不顯示TitleBar, 下一句則設定Activity為全屏模式,這兩句程式碼都會導致 ActionBar 
    無法顯示,從而使 getActionBar()獲取失敗,如果你的專案中的 Activity 有父一級別的 Activity,則也需要將父一級別的Activity中的NoTitle和全屏程式碼註釋掉;.
  2. 如果你不確定你的應用所用的主題 Theme 是否支援 ActionBar,可以在 res/values.xml 檔案中設定為Theme.AppCompat,這是 AppCompat 中的Theme主題,可以保證低版本Android上也可以使用 ActionBar(注意:res/values,res/values-v11,res/values-v14等目錄中的style都要進行style設定,並且都要注意:不要設定成第1條中會禁止ActionBar顯示的主題,但可以設定為不同種類的主題),另外,在 Acticity 中獲取 ActionBar 的時候(getActionBar()或getSupportBar()), 需要在 setContentView(R.layout.main)之後呼叫;
  3. 如果你的專案使用的是 android.app.ActionBar,則需要把你應用的最低支援版本改為11(Android 3.0),使用 getActionBar() 來獲取ActionBar,如果你的專案要支援Android 3.0以下,則你的專案需要引入最新的 AppCompat 相容包,然後將 ActionBar引用改為 android.support.v7.app.ActionBar,並使用 getSupportActionBar 來獲取 ActionBar;
  4. 除了以上的原因可能導致 ActionBar 獲取為空的話,還有其他的原因導致 getActionBar() 獲取失敗,例如我在網上查詢的時候,有人的專案是在Android SDK 2.2上新建的,當他使用 ActionBar 的時候將 AndroidManifest.xml 中的 minSdkVersion設定為11後(),發現 getActionBar() 獲取失敗是因為專案中沒有 res/values-v11和res/values-v14和其中的style.xml檔案,我最近遇到的 getActionBar() 為null是在 Eclipse 中匯入了一個別人發給我的專案,但是在他的電腦上編譯執行的apk getActionBar(), 但在我的電腦上則不行,試了上面的幾種方法也不行,最後,我把這個專案匯入到了 Android Studio 中,終於可以正常運行了。