設定画面にアクションバーを表示しようとしています。そのために、SettingActivityに次のコードを追加しました
public class PreferencesActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.preferences_activity);
getFragmentManager().beginTransaction()
.replace(R.id.container, new PreferencesFragment()).commit();
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
}
次に、PreferencesFragmentの残りのコード。これは正常に機能しますが、PreferenceScreenプリファレンスを押すとすぐに、アクションバーが非表示になります。設定のメイン画面に戻ると、再び表示されます。アクションバーを表示したままにする(そしてPreferenceScreenラベルで更新する)方法はありますか?
編集:PreferenceScreenコードを見ると、PreferenceScreenをクリックすると全画面ダイアログが開いているように見えます。私の好みにはタイトルがあるので、ダイアログにもタイトルが表示されます...しかし、表示されません
// Set the title bar if title is available, else no title bar final CharSequence title = getTitle(); Dialog dialog = mDialog = new Dialog(context, context.getThemeResId()); if (TextUtils.isEmpty(title)) { dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); } else { dialog.setTitle(title); }
私はついにこれを行う方法を見つけることができました。ちょっと醜いですが、うまくいきます。
まず、preferences.xmlファイルのすべてのPreferenceScreen定義に同じインテントを追加します(追加のパラメーターの値を必ず更新してください)
<PreferenceScreen
Android:key="pref1"
Android:summary="Summary1"
Android:title="Title1" >
<intent
Android:action="Android.intent.action.VIEW"
Android:targetPackage="my.package"
Android:targetClass="my.package.activity.PreferencesActivity" >
<extra Android:name="page" Android:value="pref1" />
</intent>
...
</PreferenceScreen>
ところでmy.package.activity.PreferencesActivityは私の現在の設定アクティビティです
次に、マニフェストにインテントフィルターを追加します
<activity
Android:name=".activity.PreferencesActivity"
Android:configChanges="keyboardHidden|orientation|screenSize"
Android:label="@string/settings" >
<intent-filter Android:label="Pref" >
<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.PREFERENCE" />
</intent-filter>
</activity>
これを処理するために、PreferenceActivityにコードを追加します
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.preferences_activity);
this.fragment = new PreferencesFragment();
this.fragment.setActivityIntent(getIntent());
getFragmentManager().beginTransaction()
.replace(R.id.container, this.fragment).commit();
}
最後に、PreferencesFragmentクラスに次のコードを追加します
public void setActivityIntent(final Intent activityIntent) {
if (activityIntent != null) {
if (Intent.ACTION_VIEW.equals(activityIntent.getAction())) {
if (intent.getExtras() != null) {
final String page = intent.getExtras().getString("page");
if (!TextUtils.isEmpty(page)) {
openPreferenceScreen(page);
}
}
}
}
private void openPreferenceScreen(final String screenName) {
final Preference pref = findPreference(screenName);
if (pref instanceof PreferenceScreen) {
final PreferenceScreen preferenceScreen = (PreferenceScreen) pref;
((PreferencesActivity) getActivity()).setTitle(preferenceScreen.getTitle());
setPreferenceScreen((PreferenceScreen) pref);
}
}
同じ問題がありました。ネストされたPreferenceScreen
sにはActionBarがありませんでした。コードをステップ実行した後、AppCompatActivity
とPreferenceScreen
の間の競合が原因であるように見えます。
一方では、AppCompatActivity
は独自のアクションバーを提供するため、Theme.AppCompat
をどこかに指定するwindowNoTitle = true
から派生したテーマが必要です(正確な場所を特定できませんでした)。一方、PreferenceScreen
は、アクティビティテーマでプラットフォームDialog
を使用します(サブテーマではなく、たとえばdialogTheme
)。バグの可能性があります。
Theme.AppCompat
を気にしない場合は、API21以降で機能する簡単な回避策を次に示します。
Android.preference.PreferenceActivity
を使用しますそのアクティビティのテーマを作成します。
<!-- This theme is used to show ActionBar on sub-PreferenceScreens -->
<style name="PreferenceTheme" parent="">
<item name="Android:windowActionBar">true</item>
<item name="Android:windowNoTitle">false</item>
</style>
Android:theme="@style/PreferenceTheme"
でこのアクティビティにAndroidManifest.xml
を指定します表示されるのは、完全なActionBarというよりも標準のウィンドウタイトルのようなものです。作業用の戻るボタンなどを追加する方法がまだわかりません。
AppCompatActivity
および関連するテーマとの互換性を維持したい場合は、アクティビティウィンドウでFEATURE_NO_TITLE
をリクエストする必要があります。それ以外の場合は、トップレベルのPreferenceScreen
に2つのアクションバー(上部に組み込み、下部にサポート)が表示されます。
グーグルは悲しいことに今までそれを修正しなかったので、実際にはもっと簡単な解決策が1つあります:
SettingsActivityクラスを「Activity」だけから拡張するように設定します。
public class SettingsActivity extends Activity { ...
SettingsActivtyのv21/stylesフォルダーに新しいテーマを作成し、親を「Theme.Material。*」に設定します。
<style name="CustomThemeSettings" parent="Android:Theme.Material"> <item name="Android:colorPrimary">@color/...</item> <item name="Android:colorPrimaryDark">@color/...</item> <item name="Android:colorAccent">@color/...</item> </style>
Manifest.xmlファイルに新しいテーマを設定します。
<activity Android:name=".SettingsActivity" Android:label="@string/title_activity_settingsactivity" Android:theme="@style/CustomThemeSettings" > </activity>
それはうまくいきます:)
(オプション)古いデバイスにマテリアルデザインのサポートを提供する場合
SettingsActivityをv21 +フォルダーに配置し、親AppCompatを持つ古いデバイス用に他のSettingsActivityを作成できます。
設定アクティビティにアクションバーがあるアプリを作成しました。それを正しく行うのに時間がかかったのを覚えていますが、それを行うための鍵がわからないようです。
私たちのコードは非常に似ているようです。私の注意を引く唯一のものはこのインポートです:import Android.support.v7.app.ActionBarActivity;
それが何か助けになるかどうか教えてください
public class SettingsActivity extends ActionBarActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction().replace(Android.R.id.content, new PrefsFragment() ).commit();
} // End of onCreate
static public class PrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences); // Load the preferences from an XML resource
}
} // end of PrefsFragment
}
追加:styles.xmlにこれがありますか?
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
</style>
しかし、PreferenceScreenプリファレンスを押すとすぐに、アクションバーは非表示になります。設定のメイン画面に戻ると、再び表示されます。
設定をクリックすると、新しいアクティビティが開始されると思います
プリファレンスフラグメントは次のようになります
public static class PreferencesFragment extends PreferenceFragment {
public PlaceholderFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.your_preferences);
}
}
次に、以下のようにyour_preferencesをサンプリングします
<PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_height="fill_parent"
Android:layout_width="fill_parent" >
<PreferenceCategory
Android:title="@string/pref_category_title">
<PreferenceScreen
Android:title="@string/title"
Android:summary="@string/summary">
<intent
Android:targetClass="com.your.package.Youractivity "
Android:targetPackage="com.your.package"/>
</PreferenceScreen>
<PreferenceScreen
Android:title="@string/another_title">
<intent
Android:targetClass="com.your.package.activity2"
Android:targetPackage="com.your.package.activity"/>
</PreferenceScreen>
</PreferenceCategory>
そして最後にYouractivityがActionBarActivityから拡張する必要がある主なもの
public class Youractivity extends ActionBarActivity {
}
上記のコードは私のために働きます。
注:API> = 14の場合のみ
PreferenceActivity1.Java
public class PreferenceActivity1 extends Android.preference.PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref1);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
LinearLayout root = (LinearLayout)findViewById(Android.R.id.list).getParent().getParent().getParent();
Toolbar bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
root.addView(bar, 0); // insert at top
bar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
PreferenceActivity2.Java
public class PreferenceActivity2 extends Android.preference.PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref2);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
LinearLayout root = (LinearLayout)findViewById(Android.R.id.list).getParent().getParent().getParent();
Toolbar bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false);
root.addView(bar, 0); // insert at top
bar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
settings_toolbar.xml(layout)
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v7.widget.Toolbar
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/toolbar"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:minHeight="?attr/actionBarSize"
app:navigationContentDescription="@string/abc_action_bar_up_description"
Android:background="?attr/colorPrimary"
app:navigationIcon="?attr/homeAsUpIndicator"
app:title="@string/app_name"
/>
pref1.xml(xml)
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:theme="@Android:style/Theme.Light" >
<PreferenceCategory Android:title="Main Preferences" >
<CheckBoxPreference
Android:key="wifi enabled"
Android:title="WiFi" />
</PreferenceCategory>
<PreferenceScreen
Android:key="key1"
Android:summary=""
Android:title="Wifi Settings" >
<intent
Android:action="Android.intent.action.VIEW"
Android:targetClass="com.example.PreferenceActivity2"
Android:targetPackage="com.example" />
</PreferenceScreen>
</PreferenceScreen>
pref2.xml(xml)
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:theme="@Android:style/Theme.Light" >
<PreferenceCategory Android:title="Wifi Settings" >
<CheckBoxPreference
Android:key="prefer wifi"
Android:title="Prefer WiFi" />
</PreferenceCategory>
</PreferenceScreen>
マニフェスト
<application
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name" >
<activity
Android:name="com.example.PreferenceActivity1"
Android:label="@string/app_name" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
Android:name="com.example.PreferenceActivity2"
Android:label="@string/app_name" >
<intent-filter>
<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
結果
質問で述べたように、フルスクリーンのDialog
が問題になる可能性があります。
Dialog
スタイルを次のように変更してみてください。
<style name="Theme.Holo.Dialog">
またはこれらのプロパティを持つスタイルに:
<item name="windowActionBar">true</item>
<item name="windowNoTitle">false</item>
ここDialog
への参照を取得する方法を読むことができます。