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

  • Cómo establecer drawables en barra de acción de mi aplicación Android
  • La aplicación se bloquea al arrancar en la API de Android 10 pero no en la API 16 debido a los recursos $ NotFoundException
  • Efecto de marca para la vista de texto elemento de lista personalizada en el enfoque de tacto
  • Coloque ImageView sobre el botón android
  • Cómo configurar un fondo translúcido para un diseño de forma programática?
  • Android: layout_weight = "33" cómo ha ido-> visible visible-> ido efecto esto?
  • ¿Cómo dar una opción para iniciar mi propia aplicación desde la página de detalles de contacto de android nativa?
  • Android: No se encontró identificador de recurso para el atributo 'headerView'
  • Genymotion + Segmentación de problemas de diseños de tableta con desplazamiento con CoordinatorLayout
  • ¿Cuál es la diferencia entre layout_gravity = "center_vertical" y layout_centerVertical = "true"
  • Arreglar botones en forma de diamante en android xml
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.