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.
Esto parece ser un error conocido .
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:
- llame a setTheme en onCreate () en su lugar, o
- 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.