web-dev-qa-db-ja.com

PreferenceScreenを変更するときは、アクションバーを表示したままにします

設定画面にアクションバーを表示しようとしています。そのために、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);
    }
18
user1026605

私はついにこれを行う方法を見つけることができました。ちょっと醜いですが、うまくいきます。

まず、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);
    }
}
6
user1026605

同じ問題がありました。ネストされたPreferenceScreensにはActionBarがありませんでした。コードをステップ実行した後、AppCompatActivityPreferenceScreenの間の競合が原因であるように見えます。

一方では、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つのアクションバー(上部に組み込み、下部にサポート)が表示されます。

6
szym

グーグルは悲しいことに今までそれを修正しなかったので、実際にはもっと簡単な解決策が1つあります:

  1. SettingsActivityクラスを「Activity」だけから拡張するように設定します。

    public class SettingsActivity extends Activity { ...

  2. 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>

  3. Manifest.xmlファイルに新しいテーマを設定します。

    <activity Android:name=".SettingsActivity" Android:label="@string/title_activity_settingsactivity" Android:theme="@style/CustomThemeSettings" > </activity>

  4. それはうまくいきます:)

  5. (オプション)古いデバイスにマテリアルデザインのサポートを提供する場合
    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>
0
Bruno Carrier

しかし、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 {
}

上記のコードは私のために働きます。

0
Deepu

注:API> = 14の場合のみ

Source1 および Source2

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>

結果
enter image description here
enter image description here

0
Sai Phani

質問で述べたように、フルスクリーンのDialogが問題になる可能性があります。

Dialogスタイルを次のように変更してみてください。

<style name="Theme.Holo.Dialog">

またはこれらのプロパティを持つスタイルに:

<item name="windowActionBar">true</item>
<item name="windowNoTitle">false</item>

ここDialogへの参照を取得する方法を読むことができます。

0
klimat