studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android layout refresh

para - manual de programacion android pdf



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

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); }


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);


De lo contrario, puedes probar esto también-

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


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 compilación. Ahora, cada vez que ocurre mi evento y quiero que mi actividad se "actualice", solo llamo a compilación, le doy la información nueva (que paso como parámetros para compilar) y tengo una actividad actualizada.



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


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


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

setContentView(R.layout.mainscreen);


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í.


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();


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

@Override public void onBackPressed() { NavUtils.navigateUpTo(this, new Intent(this, MyNeedToBeRefreshed.class)); }


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

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


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(); }


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); }


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.