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>
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.
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?
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
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);
}
}