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.

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?

Introduzca aquí la descripción de la imagen

modo retrato

Introduzca aquí la descripción de la imagen

Modo paisaje

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

  • Cuadro de diálogo de alerta de Appcompat Fondo del botón de acción En estado presionado
  • Teclado cubre la pantalla en lugar de empujar hasta el diseño?
  • Agregando "divisores de sección" a mi diseño?
  • ¿Cómo pasar el Array a otra actividad?
  • AutoCompleteTextView - cómo deshabilitar desplegable cuando tenemos una coincidencia exacta después de filtrar?
  • ¿Qué significa elipsis en android?
  • Agregue dos puntos al teclado InputType.TYPE_CLASS_NUMBER
  • AdView adjunto al fondo no me permite ver el último elemento en Recyclerview
  • Fotos de la escala de Android picasso para ser más grande o ajustar el imageView (sin espacio en blanco)
  • Gravedad y layout_gravity en Android
  • ScrollView no muestra su contenido correctamente en versiones inferiores de android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.