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
に取得してカスタムビューを適用する方法ですか?
解決した
いくつかの調査の後、PreferenceFragment
とActionBarActivity
を使用してこの問題を解決し、getSupportActionBar()
を呼び出すことができました
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);
}
}
}
設定アクティビティにカスタムテーマを指定して、この問題をなんとか修正しました。
<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_TITLE
がPhoneWindow.Java:3243
に設定されていました:
if (a.getBoolean(R.styleable.Window_windowNoTitle, false)) {
requestFeature(FEATURE_NO_TITLE);
FEATURE_ACTION_BAR
を削除します
[編集]
このアクションバーはマテリアルテーマからのものではないため、まだ完璧ではありません
[編集2]
ヘッダーをあきらめましたが、今はgithubのPreferenceFragmentバックポートを使用しています。 appcompact 21にアップグレードした後、すべてのアクションバーは同じになります。
Activity
またはFragmentActivity
を使用すると、API 5.0ではgetActionBar()
がnullを返します。この拡張機能をActionBarActivity
に解決しました
_public class MainActivity extends ActionBarActivity {
_
ActionBarActivity
(_appcompat-v7
_)を使用している場合は、getSupportActionBar()
を使用する必要があります。
これにより問題が解決し、スタイル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>