Reemplazar el diseño en el cambio de orientación
Mi aplicación tiene una vista web y algunos botones dentro de un LinerLayout.
El problema es que quiero que los botones estén en la parte inferior en modo vertical y en la izquierda en modo horizontal mientras la vista web mantiene su estado.
- Despliegue y alineación de la distribución relativa de Android
- Cómo establecerLayoutParams en elementos añadidos dinámicamente en Widget
- Disposición de Android: ancho de la mitad del padre
- Elemento compartido animación entre RecyclerView elemento y CollapsingToolbar dentro de la misma actividad
- Android Studio 0.3.6 problemas de representación cuando spinner con android: entries = "@ array / some_array" utilizado
Dos diseños diferentes no funcionan ya que obligan a recrear la actividad que actualiza la vista web. Por ahora uso android: configChanges = "orientación" en la etiqueta de la actividad para webview no obtener actualizado en el cambio de orientación.
¿Hay de todos modos para reemplazar el diseño de los botones en el cambio de modo de pantalla?
modo retrato
Modo paisaje
- Crear una gran red de contenido en Android
- Obtención de un usuario String en un cuadro de diálogo emergente
- Establecer indicio de EditText en TextInputLayout a multilínea?
- RelativeLayout no actualiza correctamente el ancho de la vista personalizada
- ¿Cómo puedo definir el tamaño de los dibujables en el archivo de estilo?
- Diferencia: android: fondo y android: src?
- Configuración de la posición de la vista en el nivel 7 de la API mediante programación
- Galaxy Mega vs otros Phablets y Android Manifest
He probado fragmentos, pero el tratamiento de fragmento hace las cosas mucho más complejas y el fragmento en sí necesita el ahorro y la restauración que puede no funcionar en una webview que tiene estado javascript, Así que busqué más y encontrar un buen artículo en algún lugar y con algunas modificaciones vine a Una solución que sugiero:
Primero, agrega android:configChanges="orientation|screenSize|keyboard|keyboardHidden"
para que la aplicación maneje los cambios de configuración en lugar de android.
Haga dos diseños diferentes para el paisaje y el retrato. En ambos diseños en lugar de webview, coloque un FrameLayout que actúa como marcador de posición para la vista web.
Defina el método initUI como este y poner todo lo relacionado con la inicialización de la interfaz de usuario en este método:
public void initui() { setContentView(R.layout.main); if (wv == null) wv = new WebView(this); ((LinearLayout)findViewById(R.id.webviewPlace)).addView(wv); findViewById(R.id.home).setOnClickListener(this); }
Si la vista web no existe aún, se creará y después de setContentView(R.layout.main)
se añadirá a la presentación. Cualquier otra personalización de la interfaz de usuario que necesites llegó después de esto.
Y en onConfigurationChanged
:
@Override public void onConfigurationChanged(Configuration newConfig) { ((LinearLayout)findViewById(R.id.webviewPlace)).removeAllViews(); super.onConfigurationChanged(newConfig); initUI(); }
En onConfigChange
la vista web se quita del marcador de posición antiguo y se initui
para volver a agregarla al nuevo diseño.
En oncreate()
llamar a initui()
para que el ui se inicialice por primera vez.
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initUI() }
Ojalá fuera útil para alguien.
Poner eso en la layout-land
para las disposiciones que usted desea como paisaje.
La idea es que no debería usar configChange="orientation"
porque tiene sus desventajas. Puedes encontrar un post detallado aquí . Debe manejar manualmente su estado si desea cambiar su diseño. Por supuesto que puede programmaiclly hacer esto, pero si desea utilizar xml para hacer esto. Usted puede mantener webView con fragmentos.
Si está utilizando android:configChanges="orientation|screenSize"
En manifiesto, ignora el XML en " layout-land ". Si crea un XML diferente para el paisaje, no utilice la android:configChanges="orientation|screenSize"
para esa actividad en el manifiesto.
Haga que su vista sea un diseño relativo. Cuando los cambios de orientación sólo ajustar los parámetros de diseño para cada vista en código. Haga que sus botones estén contenidos en un diseño lineal
Como en..
Retrato
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); buttonLinearLayout.setOrientation(LinearLayout.HORIZONTAL); buttonLinearLayout.setLayoutParams(lp); LayoutParams webParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); lp.addRule(RelativeLayout.ABOVE, R.id.buttons); webView.setLayoutParams(webParams);
Paisaje
LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); buttonLinearLayout.setOrientation(LinearLayout.VERTICAL); buttonLinearLayout.setLayoutParams(lp); LayoutParams webParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); lp.addRule(RelativeLayout.TO_RIGHT_OF, R.id.buttons); webView.setLayoutParams(webParams);
Asegúrese de que los LayoutParams que está utilizando son Parámetros RelativeLayout (siempre use Layoutparams del padre de la vista)
Intente utilizar este código:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); setContentView(R.layout.activity_splash); }
Puede añadir una carpeta de valores- (configuración que usted requiere – por ejemplo, tierra, retrato) bajo recursos y mencionar el diseño que necesita para esta configuración. Es tan simple como eso.
Por favor, compruebe el siguiente enlace para obtener más información: http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters
- No se puede crear Dir de archivos externos en Android. WRITE_EXTERNAL_STORAGE está presente
- Biblioteca PDF para renderizar los archivos PDF en Android