Fragmentos y onConfigurationChanged
Estoy tratando de hacer algo que hago con las actividades, pero dentro de un fragmento. Lo que hago es usar actividades:
Primera parada la actividad se reinicia al girar el dispositivo android:configChanges="keyboardHidden|orientation|screenSize"
- Diferencia entre setContentView y LayoutInflater
- No se puede convertir a dimension: type = 0x1 cuando se ejecuta la aplicación en Android 4.1
- Android Stringblock.get NullPointer Excepción en Lollipop
- GridView y el desorden del icono mientras que usa "si (convertView == null)"
- Crash después de agregar pie de página a ListView
En mi actividad añadir:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); setContentView(R.layout.main); }
Así que la actividad no se reinicia, sino recargando el main.xml, para usar el layout-land
Ahora tengo una actividad que muestra viewpager, que contiene tres fragmentos. Todo funciona correctamente. La detección de la rotación está en los fragmentos
public class FRG_map_web extends Fragment { @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.i("myLogs", "Rotation"); }
El problema es que el fragmento no utiliza setContentView (R.layout.main); Este es el código:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.frg.myFragment, null);
Traté de usar:
LayoutInflater inflater = inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.frg.myFragment, null); ... LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.frg.myFragment, null); ... LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE ); view = inflater.inflate(R.layout.frg.myFragment, null); ... LayoutInflater li = LayoutInflater.from(context);
Y diferentes maneras, pero siempre sin éxito no puedo inflar correctamente.
¿Puede alguien decirme cómo tengo que hacer?
Gracias de antemano, agradezco la ayuda
Saludos
- Texto diferente para cada imagen en el visor de imágenes
- Fragmento de la fuerza de Android para reconstruir Ver
- Incluir un archivo de diseño XML existente en otro archivo de diseño XML
- No se puede inflar correctamente el diseño de un fragmento en la aplicación de Android
- Los niños de Vista personalizada se null después de inflar la vista en Android
- ¿Qué significa el parámetro LayoutInflater attachToRoot?
- WebView aparece como un cuadro blanco normal después de la segunda vez que se ha inicializado
- Android: ¿Cuál es la diferencia entre View.inflate y getLayoutInflater (). Inflate?
Si entiendo correctamente, no desea que el fragmento se vuelva a cargar en cada rotación. En su lugar, desea reenviar las vistas y actualizarlas con la información que ya tiene.
public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Get a layout inflater (inflater from getActivity() or getSupportActivity() works as well) LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View newView = inflater.inflate(R.layout.frg.myFragment, null); // This just inflates the view but doesn't add it to any thing. // You need to add it to the root view of the fragment ViewGroup rootView = (ViewGroup) getView(); // Remove all the existing views from the root view. // This is also a good place to recycle any resources you won't need anymore rootView.removeAllViews(); rootView.addView(newView); // Viola, you have the new view setup }
De acuerdo con la documentación ( getView () ), getView () devuelve la misma vista que devolvió de su onCreateView () pero no lo hace. Realmente devuelve al padre de la vista que has regresado en onCreateView (), que es exactamente lo que necesitas. GetView () devolverá una instancia de NoSaveStateFrameLayout, que se utiliza específicamente para Fragmentos como su vista raíz.
Espero que esto ayude.
¿Ha considerado retener sus instancias de fragmentos? Vea Fragmento # setRetainInstance .
Permita que su actividad sea recreada (no especifique android: configChanges) pero retenga sus instancias de fragmento a través de los cambios de orientación. Si todo el trabajo pesado ocurre en Fragment # onCreate esto debería funcionar bien. OnCreate () no se volverá a llamar, ya que el fragmento no se vuelve a crear.
Podría hacerlo re-adjuntando el fragmento dentro deConfigurationChanged:
@Override public void onConfigurationChanged(Configuration newConfig) { getActivity().detachFragment(this); super.onConfigurationChanged(newConfig); .... getActivity().attachFragment(this); }
Recuerde que al separar y adjuntar su fragmento sólo estará trabajando con su vista. Pero el estado del fragmento se "guarda" en el administrador de fragmentos.
Tal vez usted puede intentar usar
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.frg.myFragment, container, false); }
. En cualquier caso, el fragmento todavía tiene que ser destruido y recreado, ¿por qué no dejar que Android lo maneje automáticamente reiniciando la actividad? Si hay algún dato que guardar, puede guardarlo en onSavedInstanceState()
. Configurar android:configChanges="keyboardHidden|orientation|screenSize"
no se recomienda en Android.