gpt4 book ai didi

Android AlertDialog - 如何处理超大消息?

转载 作者:行者123 更新时间:2023-11-29 17:49:39 24 4
gpt4 key购买 nike

当单击 ListView 项并且消息字符串非常大(将近 20,000 个字符)时,我会弹出一个 AlertDialog。最后发生的事情是我单击列表项,它在显示 AlertDialog 之前停留了大约 3-4 秒。由于多种原因,这是有问题的,主要是用户可能会重复单击该按钮并导致应用程序崩溃。

我的第一个想法是尝试模仿 Google Play 应用程序如何处理其开源许可证显示(Play -> Nav Drawer -> Settings -> Open Source License info),他们会在其中弹出 AlertDialog,然后它看起来像尽管在显示对话框后 加载了 View /文本。我想象它看起来像这样:

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);

但这似乎只是在显示之前加载了整个对话框。所以我想也许可以在 Activity 调用结束时发布一个可运行的,但这是行不通的。我尝试在异步任务中执行此操作,但也无法以这种方式工作。我试过将其作为 DialogFragment 调用

activity.getSupportFragmentManager().executePendingTransactions();

然后在我知道已显示 DialogFragment 之后继续尝试设置消息,我要么以一个空对话框结束(新消息不会显示),要么它一次加载所有内容,我是坐着 3-4 秒的延迟。

谁有实现 AlertDialog 和非常大消息的好方法?

最佳答案

这个案例是我出示Google Play Services的法律声明时:

问题似乎是 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);

关于Android AlertDialog - 如何处理超大消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23920094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com