这是我的场景:我有一个打开另一个 Activity 的登录屏幕。在 Activity 中,我只有:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
}
布局有点重,因为它是由一些 fragment 组成的,加载大约需要 1.5 秒。
现在,如何在 setContentView
完成布局膨胀时显示 ProgressDialog
?我已经尝试通过将 setContentView
放在 doInBackground
中来使用 AsyncTask
,但是当然不能这样做,因为 UI 可以从更新仅限 UI 线程。
所以我需要在 UI 线程中调用 setContentView
,但是我必须在哪里显示/关闭 ProgressDialog
?
感谢您的帮助。
兄弟。
编辑:我遵循了@JohnBoker 之前的建议,这是我现在的代码:
@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();
}
}
}
行
View inflated = inflater.inflate(R.layout.activity_details, rootView);
给我错误:
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.
最佳答案
我决定在这里为 future 的读者做一个完整的回答。
在这个问题上花了几个小时后,我意识到这个问题是我正在尝试做两件事:
- 扩充布局,这是一个 需要进行的操作 设计的 UI 线程。
- 显示一个对话框(ProgressDialog, 实际上,但这并没有改变 结果),这可以从 仅 UI 线程,因为服务 无法显示任何对话框。
因此,由于这两个调用都是从 UI 线程进行的(onCreate 或 AsyncTask 没有区别,它仍然是 UI 线程),第一个阻止第二个正确显示。 底线是:目前在 Android 中这个问题无法解决。让我们希望我们可以获得一些更好的 API 来与 UI 交互,因为我们得到的 API 有点烂。
我将通过更改布局并使其更轻(如果可能的话!)来解决这个问题。 谢谢大家!
关于android - 使用 setContentView 加载布局时显示 ProgressDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6493534/