Cómo forzar un diseño completo ¿Ver actualizar?
Quiero forzar la vista de recursos de diseño principal para volver a dibujar / actualizar, por ejemplo el método Activity.onResume (). Cómo puedo hacer esto ?
Por la vista de diseño principal, me refiero a la ('R.layout.mainscreen' a continuación) que se llama en mi Activity.onCreate (), como este:
- cómo cambiar el fondo en el diseño de Android
- Densidad y resolución de Android xhdpi
- Restaurar la jerarquía de vista desde el estado guardado no restaura las vistas agregadas programaticamente
- Disposiciones de Android en subcarpetas
- Diseño como menú radial
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mainscreen); }
- necesita una explicación para la sintaxis del diseño de Android
- Problemas con el posicionamiento de textView bajo otro textView en el diseño relativo
- Cómo instanciar el diseño para las preferencias personalizadas, utilizando android: atributo de diseño
- ¿Cómo puedo hacer que un androide ViewGroup y todas sus vistas secundarias dinámicamente mantengan el mismo ancho basado en el niño más ancho?
- ¿Cómo obtengo el siguiente resultado utilizando RelativeLayout?
- Android - creando programaticamente view progressBar
- Diseño de código para elementos de IU de arrastrar y soltar reutilizables en android
- Alineación Vertical la gravedad no responde
Para responder estrictamente a la pregunta: Use invalidate ():
Public void invalidate () Desde: API Nivel 1
Invalide la vista completa. Si la vista es visible, onDraw (Canvas) será llamado en algún momento en el futuro. Esto se debe llamar desde un subproceso de interfaz de usuario. Para llamar desde un hilo no de interfaz de usuario, llame a postInvalidate ().
ViewGroup vg = findViewById (R.id.mainLayout); vg.invalidate();
Ahora, cuando se reanuda la Actividad, hace que cada Vista se dibuje. No se necesita ninguna llamada a invalidate (). Para aplicar el tema, asegúrese de hacerlo antes de dibujar cualquier vista, es decir, antes de setContentView(R.layout.mainscreen);
Public void setTheme (int resid) Desde: API Nivel 1
Establezca el tema base para este contexto. Tenga en cuenta que esto debería llamarse antes de que se instancien las vistas en el Contexto (por ejemplo, antes de llamar a setContentView (View) o inflar (int, ViewGroup)).
La referencia del doc del API está aquí: http://developer.android.com/reference/android/view/ContextThemeWrapper.html#setTheme%28int%29
Dado que el método onDraw () funciona en Vistas ya instanciadas, setTheme no funcionará. No tengo experiencia con temas yo mismo, pero dos opciones alternativas que puedo pensar son:
- Llamada setTheme en onCreate () en su lugar, o
- Redo setContentView (R.layout.mainscreen); Para obligar a reinstantiar todo el diseño.
Pruebe getWindow().getDecorView().findViewById(android.R.id.content).invalidate();
Intente recreate () hará que esta actividad sea recreada.
Solución:
Chicos He intentado todas sus soluciones, pero no funcionó para mí, tengo que establecer setVisibility de EditText a VISIBLE y este EditText debe ser visible entonces en ScrollView , pero no pude actualizar la vista de la raíz para tener efecto. He resuelto mi problema, cuando tengo que actualizar la vista, así que cambié la visibilidad de ScrollView a GONE y luego de nuevo a VISIBLE para tener efecto y funcionó para mí. Esta no es la solución exacta, pero sólo funcionó.
private void refreshView(){ mScrollView.setVisibility(View.GONE); mScrollView.setVisibility(View.VISIBLE); }
Si no usted puede intentar esto también-
ViewGroup vg = (ViewGroup) findViewById (R.id.videoTitleTxtView); vg.removeAllViews(); vg.refreshDrawableState();
Llamar invalidate()
o postInvalidate()
en el diseño raíz aparentemente no garantiza que las vistas de los niños se volverán a dibujar. En mi caso específico, mi disposición de la raíz era TableLayout y tenía varios niños de la clase TableRow y TextView. Llamar postInvalidate()
, o requestLayout()
o incluso forceLayout()
en el objeto raíz de TableLayout no hizo que TextViews en el diseño se vuelva a dibujar.
Por lo tanto, lo que acabé haciendo fue recursivamente analizar el diseño en busca de esos TextViews y luego llamar a postInvalidate()
en cada uno de esos objetos TextView.
El código se puede encontrar en GitHub: https://github.com/jkincali/Android-LinearLayout-Parser
Pruebe esta solución para el problema de tema:
@Override public void onBackPressed() { NavUtils.navigateUpTo(this, new Intent(this, MyNeedToBeRefreshed.class)); }
Simplemente configure su vista de contenido en onresume
SetContentView (R.layout.yourview) dentro de onResume ..
Ejemplo:
@Override public void onResume(){ super.onResume(); setContentView(R.layout.activity_main); postIncomeTotals(); }
Esto parece ser un error conocido .
Yo estaba teniendo este problema también, pero siguiendo el ejemplo de Farhan de usar setContentView () hice justamente eso. Usar setContentView () por sí mismo no fue suficiente sin embargo. Encontré que tenía que repoblar todas mis opiniones con información. Para arreglar esto acabo de sacar todo ese código a otro método (lo llamé construir) y en mi método onCreate simplemente llamo a esa compilación. Ahora, cada vez que mi evento ocurre, quiero que mi actividad se "refresque", solo llamo build, le doy la nueva información (la cual paso como parámetros para construir) y tengo una actividad actualizada.
Intent intent = getIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); finish(); startActivity(intent);
Esto le permite volver a cargar con los cambios de tema y oculta las animaciones.
No sé si esto es seguro o no, pero funcionó para mí. Me encontré un poco en este problema yo mismo e intentado invalidate()
y requestLayout()
pero en vano. Así que acabo de llamar a mi onCreate(null)
todo de nuevo y funcionó. Si esto no es seguro por favor hágamelo saber. Espero que esto ayude a alguien por ahí.
Así es como he utilizado para actualizar mi diseño
Intent intent = getIntent(); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION); finish(); startActivity(intent);
- Uso de forceLayout (), requestLayout () e invalidate ()
- Android WebView: cómo gestionar los cambios de orientación