Oto mój scenariusz: Mam ekran logowania, który otwiera inną aktywność. W działaniu mam po prostu:Pokaż ProgressDialog podczas ładowania układu z setContentView
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
}
Układ jest dość ciężki, ponieważ składa się z kilku fragmentów, a jego załadowanie zajmuje około 1,5 sekundy. Teraz, jak mogę wyświetlić ProgressDialog
, gdy setContentView
kończy nadmuchiwanie układu? Próbowałem z AsyncTask
umieszczając setContentView
w doInBackground
, ale oczywiście nie można tego zrobić, ponieważ interfejs można aktualizować tylko z poziomu interfejsu użytkownika. Muszę więc zadzwonić pod numer setContentView
w wątku interfejsu użytkownika, ale gdzie muszę pokazać/odrzucić numer ProgressDialog
?
Doceniam twoją pomoc.
Fra.
EDIT: po @ JohnBoker w poprzednim sugestii, jest to kod mam teraz:
@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();
}
}
}
Wiersz
View inflated = inflater.inflate(R.layout.activity_details, rootView);
daje mi błąd:
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.
Co powiecie na ręczne nadmuchiwanie w metodzie doInBackground? –
Byłoby interesujące zobaczyć twój plik układu, najlepiej, aby spróbować i zoptymalizować, co myślę. Czy jest 1,5 sekundy na emulatorze, czy na telefonie/tablecie? – Marty
Witam, w rzeczywistości jest to około 1,5 sekundy na transformatorze eeePad. Jak mogę nadmuchać to ręcznie? Układ jest tu dość długi, ale ma około 10-12 układów liniowych i jeden prawdziwy fragment (na razie). – frapontillo