Comment revenir de préférences subscreen à l'écran principal dans PreferenceFragmentCompat?

j'essaie d'implémenter un écran de réglages en utilisant PreferenceFragmentCompat. Ma préférence xml a une préférence accès à l'écran comme ceci:

préférences.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>

Écran Principal De Préférence

maintenant, dans l'application, le subscreen ne s'ouvre pas tant que je n'implémente pas PreferenceFragmentCompat.Interface OnPreferenceStartScreenCallback dans l'activité parent, comme spécifié dans PreferenceFragmentCompat doc.

activité principale.java

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

voici où le problème se pose. Sur la mise en œuvre de l'interface, l'écran s'ouvre, mais il n'y a aucun moyen que je peux trouver pour revenir au premier écran.

Préférence Accès À L'Écran

appuyer sur la touche back ferme l'application.

y a-t-il un moyen que je puisse mettre une flèche arrière sur la barre d'application pour que la presser ramène l'écran principal?

8
demandé sur madlymad 2015-09-10 09:21:57

2 réponses

en utilisant setPreferenceScreen vous paramétrez l'écran de préférence racine à l'écran de sous-préférence qui vous empêche d'avoir une hiérarchie d'écrans de préférence pour naviguer à travers.

je vous suggère de traiter chaque écran de préférence comme un Fragment et d'ajouter un nouveau Fragment lorsque vous naviguez dans un sous-écran.

@Override
public boolean onPreferenceStartScreen(PreferenceFragmentCompat preferenceFragmentCompat,
                                       PreferenceScreen preferenceScreen) {
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    MyPreferenceFragment fragment = new MyPreferenceFragment();
    Bundle args = new Bundle();
    args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, preferenceScreen.getKey());
    fragment.setArguments(args);
    ft.add(R.id.fragment_container, fragment, preferenceScreen.getKey());
    ft.addToBackStack(preferenceScreen.getKey());
    ft.commit();
    return true;
}

MyPreferenceFragment

public class MyPreferenceFragment extends AppPreferenceFragment {

   public static final String FRAGMENT_TAG = "my_preference_fragment";

   public MyPreferenceFragment() {
   }

   @Override
   public void onCreatePreferences(Bundle bundle, String rootKey) {
       setPreferencesFromResource(R.xml.preferences, rootKey);
   }
}

AppPreferenceFragment

public abstract class AppPreferenceFragment extends PreferenceFragmentCompat {

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    // Set the default white background in the view so as to avoid transparency
      view.setBackgroundColor(
              ContextCompat.getColor(getContext(), R.color.background_material_light));

  }
}

de cette façon, lorsque vous appuyez sur le bouton arrière, chaque Fragment sera sorti de la pile.

pour plus d'information voir ce GitHub projet

15
répondu Scott Cooper 2015-10-11 14:42:01

j'ai ajouté un exemple de travail complet avec des captures d'écran et des morceaux de code ici dans ce post , j'espère que ce sera utile à quelqu'un.

il couvre les scénarios suivants:-- 1) un écran principal avec deux cases à cocher et un titre subscreen. 2) sur le clic du titre subscreen, la nouvelle préférence subscreen s'ouvre. 3) sur le dos pressé, la commande passe à l'écran principal de réglages. Donc la presse arrière est manipulée correctement.

La MainActivity ressemble à ceci (overridden onpreferencestartscreen méthode gère l'ouverture de nouveau subscreen dans une nouvelle fenêtre): --

  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;
    }

et enfin le fragment in subscreen setPreferencesFromResource(R.xml.preferences, rootKey) ; traite la fixation de subscreen à la 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);
    }
}
2
répondu Nicks 2017-05-23 12:02:17