Cómo forzar un diseño completo ¿Ver actualización?

Quiero obligar a la vista de recursos de diseño principal a volver a dibujar / actualizar, por ejemplo, el método Activity.onResume (). Cómo puedo hacer esto ?

Por vista de diseño principal, me refiero a la (‘R.layout.mainscreen’ a continuación) que se llama en mi Activity.onCreate (), así: –

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mainscreen); } 

Para responder estrictamente a la pregunta: Usar invalidate ():

public void invalidate () Desde: API Nivel 1

Invalidar toda la vista Si la vista es visible, se llamará a onDraw (Canvas) en algún momento en el futuro. Esto debe invocarse desde un subproceso de interfaz de usuario. Para llamar desde un hilo que no sea UI, llame a postInvalidate ().

 ViewGroup vg = findViewById (R.id.mainLayout); vg.invalidate(); 

Ahora, cuando la actividad se reanuda, hace que cada vista se dibuje sola. No se necesita llamar a invalidar (). 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 debe invocarse antes de que se creen instancias en el Contexto (por ejemplo, antes de llamar a setContentView (View) o inflate (int, ViewGroup)).

La referencia del doc API está aquí: http://developer.android.com/reference/android/view/ContextThemeWrapper.html#setTheme%28int%29

Como el método onDraw () funciona en vistas ya creadas, setTheme no funcionará. No tengo experiencia con temas por mi cuenta, pero puedo pensar en dos opciones alternativas:

  1. llame a setTheme en onCreate () en su lugar, o
  2. rehacer setContentView (R.layout.mainscreen); para obligar a reinstalar todo el diseño.

Pruebe getWindow().getDecorView().findViewById(android.R.id.content).invalidate();

Intenta recrear () hará que esta actividad sea recreada.

Solución:

Chicos, probé todas sus soluciones, pero no funcionaron para mí, tengo que establecer la visibilidad de EditText en VISIBLE y este EditText debería estar visible en ScrollView , pero no pude actualizar la vista raíz para que tenga efecto. Resolví mi problema, cuando necesito actualizar la vista, cambié la visibilidad de ScrollView a GONE y luego la configuré en VISIBLE para que tuviese efecto y funcionó para mí. Esta no es la solución exacta, pero solo funcionó.

  private void refreshView(){ mScrollView.setVisibility(View.GONE); mScrollView.setVisibility(View.VISIBLE); } 

Llamar a invalidate() o postInvalidate() en el diseño de la raíz aparentemente NO garantiza que las vistas de los niños sean redibujadas. En mi caso específico, mi diseño de raíz era un TableLayout y tenía varios hijos de clase TableRow y TextView. Llamar a postInvalidate() o requestLayout() o incluso a forceLayout() en el objeto raíz de TableLayout no provocó que se redibujara ningún TextViews en el diseño.

Entonces, lo que terminé haciendo fue analizar de forma recursiva el diseño buscando 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

De lo contrario, puedes probar esto también-

 ViewGroup vg = (ViewGroup) findViewById (R.id.videoTitleTxtView); vg.removeAllViews(); vg.refreshDrawableState(); 

Solo configura tu vista de contenido en el resumen

setContentView (R.layout.yourview) dentro de Reesume ..

Ejemplo:

 @Override public void onResume(){ super.onResume(); setContentView(R.layout.activity_main); postIncomeTotals(); } 

Pruebe esta solución alternativa para el problema de tematización:

 @Override public void onBackPressed() { NavUtils.navigateUpTo(this, new Intent(this, MyNeedToBeRefreshed.class)); } 
 Intent intent = getIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); finish(); startActivity(intent); 

Esto le permite recargar con cambios de tema y oculta las animaciones.

Esto parece ser un error conocido .

Estaba teniendo este problema también, pero siguiendo el ejemplo de Farhan de usar setContentView() hice exactamente eso. sin setContentView() uso de setContentView() no fue suficiente. Descubrí que tenía que volver a llenar todos mis puntos de vista con información. Para solucionar esto, saqué todo ese código a otro método (lo llamé build) y en mi método onCreate simplemente llamé a esa comstackción. Ahora, cada vez que ocurre mi evento y quiero que mi actividad se “actualice”, solo llamo a comstackción, le doy la información nueva (que paso como parámetros para comstackr) y tengo una actividad actualizada.

No sé si esto es seguro o no, pero funcionó para mí. Un poco encontré este problema e intenté invalidate() y requestLayout() pero fue en vano. Así que llamé a onCreate(null) una vez más y funcionó. Si esto no es seguro, házmelo saber. Espero que esto ayude a alguien por ahí.

Así es como solía 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); 

No estoy seguro si es un buen enfoque, pero solo llamo esto cada vez:

 setContentView(R.layout.mainscreen); 

Simplemente llame a la actividad nuevamente usando el bash. Por ejemplo, para actualizar el diseño de MainActivity, haga lo siguiente:

 startActivity(new Intent(MainActivity.this, MainActivity.class));