11

PreferenceFragmentCompat を使用して設定画面を実装しようとしています。私の好みの xml には、次のような好みのサブスクリーンがあります。

設定.xml

    <CheckBoxPreference
        android:defaultValue="false"
        android:key="@string/pref_sound_key"
        android:summary="@string/pref_sound_summary"
        android:title="@string/pref_sound_title" />

    <PreferenceScreen android:title="Inner Screen">
        <CheckBoxPreference
            android:defaultValue="true"
            android:key="@string/key_1"
            android:title="@string/title_1" />

        <CheckBoxPreference
            android:defaultValue="true"
            android:key="@string/key_1"
            android:title="@string/title_1" />

        <CheckBoxPreference
            android:defaultValue="true"
            android:key="@string/key_2"
            android:title="@string/title_2" />

        <CheckBoxPreference
            android:defaultValue="true"
            android:key="@string/key_3"
            android:title="@string/title_3" />
    </PreferenceScreen>

</PreferenceScreen>

設定メイン画面

現在、アプリでは、PreferenceFragmentCompat ドキュメントで指定されているように、親アクティビティに PreferenceFragmentCompat.OnPreferenceStartScreenCallback インターフェイスを実装するまで、サブスクリーンは開きません。

MainActivity.java

public boolean onPreferenceStartScreen(PreferenceFragmentCompat preferenceFragmentCompat,
 PreferenceScreen preferenceScreen) {    
    preferenceFragmentCompat.setPreferenceScreen(preferenceScreen);
    return true;
}

ここで問題が発生します。インターフェイスを実装すると、サブ画面が開きますが、最初の画面に戻る方法がありません。

プリファレンスサブスクリーン

戻るキーを押すと、アプリが閉じます。

アプリバーに戻る矢印を配置して、それを押すとメイン画面に戻る方法はありますか?

4

2 に答える 2

2

スクリーンショットとコード スニペットを含む完全な動作例をこの投稿に追加しました。これが誰かの役に立てば幸いです。

次のシナリオをカバーします:-- 1) 2 つのチェックボックスとサブスクリーン タイトルを含むメイン設定スクリーン。2) サブ画面のタイトルをクリックすると、新しい設定サブ画面が開きます。3) 背面を押すと、コントロールはメインの設定画面に移動します。だから、バックプレスは適切に処理されます。

MainActivity は次のようになります (オーバーライドされた onPreferenceStartScreen メソッドは、新しいウィンドウで新しいサブスクリーンを開く処理を行います):--

  public class MainActivity extends AppCompatActivity implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback {

    private static final String TAG = MainActivity.class.getName();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment fragment = null;
        if (savedInstanceState == null) {
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragment = new AdvancedSettingsFragment().newInstance("Advanced Setting");
            fragmentTransaction.add(R.id.fragment_container, fragment);
            fragmentTransaction.commit();
        }
    }

    @Override
        public boolean onPreferenceStartScreen(PreferenceFragmentCompat preferenceFragmentCompat,
                                           PreferenceScreen preferenceScreen) {
        Log.d(TAG, "callback called to attach the preference sub screen");
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        AdvancedSettingsSubScreenFragment fragment = AdvancedSettingsSubScreenFragment.newInstance("Advanced Settings Subscreen");
        Bundle args = new Bundle();
        //Defining the sub screen as new root for the  subscreen
        args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, preferenceScreen.getKey());
        fragment.setArguments(args);
        ft.replace(R.id.fragment_container, fragment, preferenceScreen.getKey());
        ft.addToBackStack(null);
        ft.commit();
        return true;
    }

そして最後に、サブスクリーンのフラグメントsetPreferencesFromResource(R.xml.preferences, rootKey); ルートキーへのサブスクリーンの添付を処理します。

public class AdvancedSettingsSubScreenFragment extends PreferenceFragmentCompat {
    private static final String TAG = AdvancedSettingsSubScreenFragment.class.getName();
    public static final String PAGE_ID = "page_id";

    public static AdvancedSettingsSubScreenFragment newInstance(String pageId) {
        AdvancedSettingsSubScreenFragment f = new AdvancedSettingsSubScreenFragment();
        Bundle args = new Bundle();
        args.putString(PAGE_ID, pageId);
        f.setArguments(args);
        return (f);
    }

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        // rootKey is the name of preference sub screen key name , here--customPrefKey
        setPreferencesFromResource(R.xml.preferences, rootKey);
        Log.d(TAG, "onCreatePreferences of the sub screen " + rootKey);
    }
}
于 2016-03-20T23:26:55.000 に答える