summer studio preferencefragmentcompat medium create android android-actionbar preferenceactivity

android - studio - salesforce summer 18



Android PreferenceScreen anidado con ActionBar (1)

En lugar de utilizar la PreferenceScreen anidada, podemos usar una Preferencia simple que se puede hacer clic y hacer que funcione como si fuera un "Encabezado anidado"; esto mostrará la ActionBar habitual, ya que inicia una instancia de PreferenceActivity y, por lo tanto, también mantendrá el estilo de navegación de panel simple / panel doble. Aquí hay un código de ejemplo simplificado, que incluye la configuración del botón de navegación trasera de ActionBar:

main_preferences.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:orderingFromXml="true"> <Preference android:key="a_preference" /> <!-- this is our "nested header", a simple Preference --> <Preference android:key="subscreen_preference" /> <Preference android:key="another_ preference" /> </PreferenceSreen>

subscreen_preference.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:orderingFromXml="true"> <Preference android:key="sub_preference" /> <!-- etc --> </PreferenceSreen>

MyPreferenceActivity.class

public class MyPreferenceActivity extends AppCompatPreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //display back button. Fragments will handle its behavior (see below) getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override public void onBuildHeaders(List<Header> target) { loadHeadersFromResource(R.xml.pref_headers, target); } @Override protected boolean isValidFragment(String fragmentName) { return MainPreferenceFragment.class.getName().equals(fragmentName) || SubscreenFragment.class.getName().equals(fragmentName); } public static class MainPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { //let the fragment intercept the ActionBar buttons: setHasOptionsMenu(true); addPreferencesFromResource(R.xml.main_preferences); findPreference("subscreen_preference").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { //we create a Header manually: Header header = new Header(); //mandatory fragment name: header.fragment = "com.foo.MyPreferenceActivity$SubscreenFragment"; //subscreen title to be shown in the ActionBar header.titleRes = R.string.settings_fragment_title; //this will do the trick, no further action required: //we can ignore the second parameter ((MyPreferenceActivity)getActivity()).onHeaderClick(header, 0); return true; } }); } //this will make the ActionBar back navigation button // behave like the system back button @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { if (!super.onOptionsItemSelected(item)) { getActivity().onBackPressed(); } return true; } return super.onOptionsItemSelected(item); } } public static class SubscreenFragment extends PreferenceFragment { //usual implementation } }

Importante : si usa Proguard, recuerde agregar la siguiente regla, de lo contrario isInvalidFragment () devolverá false:

-keepnames class com.foo.MyPreferenceActivity$SubscreenFragment

Tengo en mi aplicación de Android una SettingsActivity. Originalmente no había Actionbar, así que implementé esto:

settings_toolbar.xml

<?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/action_settings" />

SettingsActivity.java

public class SettingsActivity extends PreferenceActivity { @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(); } }); } }

Funciona muy bien, pero solo para la primera PreferenceScreen. Si tengo una PreferenceScreen anidada, entonces no hay ActionBar. ¿Cómo puedo lograr esto, tener en la PreferenceScreen anidada una ActionBar con botón de retroceso también?

Debería ser compatible con API15 + y AppCombat

Publicación original: ¿Cómo agregar Action Bar desde la biblioteca de soporte a PreferenceActivity?