web-dev-qa-db-ja.com

getActionBar()はPreferenceActivityでnullを返します(AppCompat-v7 21)

V20 sdkサンプルで提供されているように、PreferenceActivityにDoneBar(アクションバーの2つのボタン)を実装しましたが、SDKとAppCompatをバージョン21に更新した後、アプリが次の場所でクラッシュします

Java.lang.NullPointerException: Attempt to invoke virtual method 'void Android.app.ActionBar.setDisplayOptions(int, int)' on a null object reference

これは、getActionBar()がnullを返すためです。そして、ActionBarActivityのようなgetSupportActionBar()はありません。

だから私の質問は、そのアクションバーオブジェクトをPreferenceActivityに取得してカスタムビューを適用する方法ですか?

解決した

いくつかの調査の後、PreferenceFragmentActionBarActivityを使用してこの問題を解決し、getSupportActionBar()を呼び出すことができました

24

xXxが要求したように、私はどのようにしたか例を提供しています:

public class SettingsActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Display the fragment as the main content.
        getFragmentManager().beginTransaction()
                .replace(Android.R.id.content, new SettingsFragment())
                .commit();

        // use action bar here
        ActionBar actionBar = getSupportActionBar();
    }

    public static class SettingsFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle paramBundle) {
            super.onCreate(paramBundle);
            addPreferencesFromResource(R.xml.pref_settings);
        }
    }

}
15

設定アクティビティにカスタムテーマを指定して、この問題をなんとか修正しました。

<style name="SettingsTheme" parent="style/Theme.AppCompat.Light">
    <item name="Android:windowNoTitle">false</item>
    <item name="Android:windowActionBar">true</item>
</style>

および:アクティビティのマニフェストのAndroid:theme="@style/SettingsTheme"

actionbarが再びKitKatとLOLIPOPに表示され、(テストしていません)api v11に戻ります。私はそれをテストしました、そしてそれはapi 10で(期待どおりにアクションバーなしで)動作します。

ロリポップのデバッグから、FEATURE_NO_TITLEPhoneWindow.Java:3243に設定されていました:

   if (a.getBoolean(R.styleable.Window_windowNoTitle, false)) {
        requestFeature(FEATURE_NO_TITLE);

FEATURE_ACTION_BARを削除します

[編集]

このアクションバーはマテリアルテーマからのものではないため、まだ完璧ではありません

[編集2]

ヘッダーをあきらめましたが、今はgithubのPreferenceFragmentバックポートを使用しています。 appcompact 21にアップグレードした後、すべてのアクションバーは同じになります。

17
marcinj

ActivityまたはFragmentActivityを使用すると、API 5.0ではgetActionBar()がnullを返します。

この拡張機能をActionBarActivityに解決しました

_public class MainActivity extends ActionBarActivity {
_

ActionBarActivity(_appcompat-v7_)を使用している場合は、getSupportActionBar()を使用する必要があります。

7
Jorgesys

これにより問題が解決し、スタイルxmlは次のようになります。

res/values/style.xml

<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
    <item name="Android:windowDisablePreview">true</item>
    <item name="Android:windowActionBar">true</item>
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>

res/values-v11/style.xml

<style name="AppBaseTheme" parent="Android:Theme.Holo.Light"> 
        <!-- API 11 theme customizations can go here. -->
    </style>

res/values-v14/style.xml

<style name="AppBaseTheme" parent="Android:Theme.Holo.Light"> 
        <!-- API 11 theme customizations can go here. -->
    </style>
1
Hiren Patel