Ocultar menú de opciones en PreferenceFragment
Tengo una aplicación con varios fragmentos.
Sólo un fragmento tiene un menú de opciones. Un fragmento podría ser iniciado a partir del fragmento B (que extiende listfragment).
- ¿Cómo implemento el método onCreateOptionsMenu en un SherlockFragment?
- ¿Cómo cambiar el icono del menú de opciones en la barra de acción?
- Color de fondo del menú de opciones de la barra de herramientas
- Java.lang.illegalstateexception: ya se ha establecido una fábrica en este layoutinflater
- ¿Cómo diseñar el Overflow de Barras de Acción en dispositivos con un botón de menú de hardware?
Así que el fragmento B no tiene un menú de opciones, si selecciono algún elemento de él, el fragmento A se iniciará con un menú de opciones y si regresa, el fragmento B todavía no tiene un menú de opciones.
El problema es si selecciono el menú Configuración (que extiende el fragmento de preferencia) desde el cajón de navegación mientras mi ventana actual es el fragmento A, un fragmento de configuración se mostrará con el menú de opciones del fragmento A. Pero si selecciono el menú Configuración del cajón de navegación mientras mi ventana actual Es el fragmento B, C, D (sin menú de opciones) todo funciona bien.
Fragmento A:
@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.menu_station, menu); }
Fragmento de configuración:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); sharedPreferenceSettings = new SharedPreferenceSettings(getActivity()); addPreferencesFromResource(R.xml.settings); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_settings, container, false); }
¿Dónde está el problema?
EDITAR:
Después de horas de depuración encontré una solución. El problema era fragmentManager diferente para la transacción de fragmentos. Para el fragmento de ajustes solo usé getSupportFragmentManager (), para otros – fragmentManager (). Esto hace que algunos fragmentos se muevan a la pila trasera.
- Usando invalidateOptionsMenu () con el sistema de inicio de sesión (Android)
- Android: cambia el ancho del menú de desbordamiento
- Android - cambia dinámicamente el menú de opciones, pero al inflar desde XML
- Creación de un menú de opciones emergentes en una barra de acción contextual
- Menú de opciones de Android en fragmento
- OnCreateOptionsMenu () llamando a super
- Hacer clic en icono de hamburguesa en la barra de herramientas no abre Cajón de navegación
- El menú de opciones de onCreate no se muestra en android 3.1
Veo dos sospechosos de código. Sugerencia de código para el fragmento A:
@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_station, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); ... }
Notas:
-
super.onCreateOptionsMenu()
normalmente se llama después de inflar. Esto no está bien documentado, así que no estoy seguro de cuál es la diferencia. Un post relacionado de SO que muchos acuerdan como la mejor respuesta es @ Menú de Opciones de Android en Fragmento . -
setHasOptionsMenu(true)
se realiza en el mismo fragmento en lugar del fragmento Settings. Fragmentos guardar sus propios datos y estados. No puedes modificar estados entre fragmentos tan fácilmente.
De la lectura de su mensaje, creo que debe utilizar un diseño de fragmento temporal para ser reemplazado por el fragmento deseado. Sugerencia de código:
FragmentManager fragManager = this.getSupportFragmentManager(); MyFragment myFragment = MyFragment.newInstance(); FragmentTransaction fragmentTransaction = fragManager.beginTransaction(); FragmentTransaction transaction = this.getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.sample_content_fragment, myFragment, "MyFrag"); transaction.addToBackStack(null); // support the Back key transaction.commit();
En el Layout :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/sample_main_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > ... <FrameLayout android:id="@+id/sample_content_fragment" android:layout_width="match_parent" android:layout_height="match_parent" /> ... </LinearLayout>
Notas:
- El diseño del fragmento temporal se denomina
sample_content_fragment
. Este es el contenedor principal para mantener una pila de fragmentos. - Esta técnica utiliza sólo una pila de fragmentos para administrar en lugar de varias pilas.
- Registro de identificación del dispositivo directamente con Amazon SNS
- ¿Es posible usar la implementación de VpnService para capturar y enviar paquetes?