当单击一个AlertDialog项时,当消息的字符串非常大(将近2000个字符)时,我将弹出一个ListView。最后发生的是,我单击列表项,它在显示AlertDialog之前大约停留3到4秒。这是有问题的,因为很多原因,主要是用户可以反复点击按钮,并使应用程序崩溃。
我的第一个想法是试图模仿Google应用程序如何处理他们的开源许可证显示(Play -> Nav text -> Settings -> open info),在这里他们弹出打开AlertDialog,然后看起来就像是在对话框显示后加载了视图/文本。我想象它看起来是这样的:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(title);
builder.setMessage(veryLongStringMessage);
builder.setCancelable(true);
builder.setNeutralButton(android.R.string.ok, listener);
final AlertDialog alertDialog = builder.create();
alertDialog.show();到目前为止都是很基本的东西。然后,我尝试删除构建器中的消息集,如下所示:
builder.setMessage("")
// create/show dialog as above
alertDialog.setMessage(veryLongStringMessage);但这似乎只是在显示之前加载整个对话框。所以我想,也许在活动调用结束时发布一个可运行的链接,这是行不通的。我尝试在异步任务中这样做,但也无法让它以这种方式工作。我试过把这个作为DialogFragment打电话
activity.getSupportFragmentManager().executePendingTransactions();然后,在我知道DialogFragment已经显示之后,继续尝试设置消息,我要么使用一个空对话框结束(新消息不会显示),要么立即加载它,然后我将等待3-4秒的延迟。
有谁有用非常大的消息实现和AlertDialog的好方法吗?
发布于 2014-07-12 14:19:02
在这个案例中,我展示了Google的法律公告:
问题似乎是Dialog.show(),它花了几秒钟才能生成布局。所以,我在我的情况下所做的,也许不是最好的,但它是有效的。我创建了一个时态对话框。
private void showGPSLicense() {
AlertDialog.Builder LicenseDialog = new AlertDialog.Builder(MyActivity.this);
LicenseDialog.setTitle(getString(R.string.google_maps_legalnotices));
LicenseDialog.setMessage(getString(R.string.google_maps_loading));
final Dialog loadingDialog = LicenseDialog.create();
loadingDialog.show();
//This dialog does not take much time. Meanwhile I get via AsyncTask the heavy message, replacing/dismissing the previous dialog.
(new AsyncTask<Void, Void,AlertDialog.Builder>() {
@Override
protected AlertDialog.Builder doInBackground(Void... arg0) {
String LicenseInfo = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(getApplicationContext());
AlertDialog.Builder LicenseDialog = new AlertDialog.Builder(MyActivity.this);
LicenseDialog.setTitle(getString(R.string.google_maps_legalnotices));
LicenseDialog.setMessage(LicenseInfo);
return LicenseDialog;
}
protected void onPostExecute(AlertDialog.Builder result) {
Dialog dialog = result.create();
dialog.setOnShowListener(new OnShowListener() {
public void onShow(DialogInterface dialog) {
loadingDialog.dismiss();
}
});
dialog.show();
}
}).execute();
}在Nexus 5 (4.4.2)上测试
如果您担心多次单击,也可以通过实现OnClickListener来防止多次单击:
public abstract class PreventManyClicksListener implements OnClickListener {
private boolean clickable = true;
public abstract void preventManyClicks(View view);
public final void onClick(View view) {
if (clickable) {
clickable = false;
preventManyClicks(view);
}
}
public void setClickable() {
clickable = true;
}
}
//...
private PreventManyClicksListener preventDialog = new PreventManyClicksListener() {
@Override
public void preventManyClicks(View view) {
showGPSLicense();
setClickable();
}
};
//..
myView.setOnClickListener(preventDialog);发布于 2014-05-28 19:43:46
我认为您需要使用自定义视图才能做到这一点,因为您不能在创建AlertDialog消息之后更新它。使用id为TextView的textView1创建一个自定义视图,使用id为progressBar1的ProgressBar创建一个自定义视图,然后创建以下类。
public class MyDialogFragment extends DialogFragment {
private TextView mTextView;
private ProgressBar mProgressBar;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_dialog, container, false);
mTextView = view.findViewById(R.id.textView1);
mTextView.setVisibility(View.GONE);
mProgressBar = view.findViewById(R.id.progressBar1);
mProgressBar.setVisibility(View.VISIBILE);
return view;
}
@Override
public View onStart() {
super.onStart();
mTextView.setText(getArguments().getString("text");
mProgressBar.setVisibility(View.GONE);
mTextView.setVisibility(View.VISIBILE);
}
}您还需要在其参数中传递文本字符串。
DialogFragment dialog = new MyDialogFragment();
Bundle args = new Bundle();
args.putString("text", text);
dialog.setArguments(args);
dialog.show(getFragmentManager(), "my_dialog")https://stackoverflow.com/questions/23920094
复制相似问题