este es mi caso: tengo una pantalla de inicio de sesión que abre otra actividad. En la Actividad Simplemente tengo:Mostrar progresoDialog al cargar el diseño con setContentView
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
}
El diseño es un poco pesado, causa que está hecha de algunos fragmentos, y tarda alrededor de 1,5 segundos en cargar. Ahora, ¿cómo puedo mostrar un ProgressDialog
mientras que setContentView
termina de inflar el diseño? Lo he intentado con AsyncTask
poniendo el setContentView
en el doInBackground
, pero, por supuesto, eso no se puede hacer, ya que la interfaz de usuario solo se puede actualizar desde el subproceso de la interfaz de usuario. Necesito llamar al setContentView
en el hilo de la interfaz de usuario, pero ¿dónde debo mostrar/descartar el ProgressDialog
?
Agradezco su ayuda.
Fra.
EDIT: He seguido @ sugerencia anterior de JohnBoker, este es el código que tengo ahora:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_empty_layout);
new ContentSetterTask().execute("");
}
private class ContentSetterTask extends AsyncTask<String, Void, Void> {
public ProgressDialog prgDlg;
@Override
protected void onPreExecute() {
android.os.Debug.waitForDebugger();
prgDlg = ProgressDialog.show(MultiPaneActivity.this, "", "Loading...", true);
}
@Override
protected Void doInBackground(String... args) {
android.os.Debug.waitForDebugger();
ViewGroup rootView = (ViewGroup)findViewById(R.id.emptyLayout);
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View inflated = inflater.inflate(R.layout.activity_details, rootView);
return null;
}
@Override
protected void onPostExecute(Void arg) {
android.os.Debug.waitForDebugger();
if (prgDlg.isShowing())
prgDlg.dismiss();
}
}
}
La fila
View inflated = inflater.inflate(R.layout.activity_details, rootView);
me da el error:
06-27 16:47:24.010:
ERROR/AndroidRuntime(8830): Caused by:android.view.ViewRoot$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its views.
¿Qué hay de inflarlo manualmente en el método doInBackground? –
Sería interesante ver su archivo de diseño, lo mejor es intentar y optimizar eso, creo. ¿Son los 1.5 segundos en el emulador o en el teléfono/tableta? – Marty
Hola, en realidad es de aproximadamente 1,5 segundos en el transformador eeePad. ¿Cómo puedo inflarlo manualmente? El diseño es bastante largo para ser publicado aquí, pero tiene alrededor de 10-12 diseños lineales y un fragmento real (por ahora). – frapontillo