首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android AlertDialog --我如何处理非常大的消息?

Android AlertDialog --我如何处理非常大的消息?
EN

Stack Overflow用户
提问于 2014-05-28 19:17:38
回答 2查看 1.1K关注 0票数 1

当单击一个AlertDialog项时,当消息的字符串非常大(将近2000个字符)时,我将弹出一个ListView。最后发生的是,我单击列表项,它在显示AlertDialog之前大约停留3到4秒。这是有问题的,因为很多原因,主要是用户可以反复点击按钮,并使应用程序崩溃。

我的第一个想法是试图模仿Google应用程序如何处理他们的开源许可证显示(Play -> Nav text -> Settings -> open info),在这里他们弹出打开AlertDialog,然后看起来就像是在对话框显示后加载了视图/文本。我想象它看起来是这样的:

代码语言:javascript
复制
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();

到目前为止都是很基本的东西。然后,我尝试删除构建器中的消息集,如下所示:

代码语言:javascript
复制
builder.setMessage("")
// create/show dialog as above
alertDialog.setMessage(veryLongStringMessage);

但这似乎只是在显示之前加载整个对话框。所以我想,也许在活动调用结束时发布一个可运行的链接,这是行不通的。我尝试在异步任务中这样做,但也无法让它以这种方式工作。我试过把这个作为DialogFragment打电话

代码语言:javascript
复制
activity.getSupportFragmentManager().executePendingTransactions();

然后,在我知道DialogFragment已经显示之后,继续尝试设置消息,我要么使用一个空对话框结束(新消息不会显示),要么立即加载它,然后我将等待3-4秒的延迟。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-12 14:19:02

在这个案例中,我展示了Google的法律公告:

问题似乎是Dialog.show(),它花了几秒钟才能生成布局。所以,我在我的情况下所做的,也许不是最好的,但它是有效的。我创建了一个时态对话框。

代码语言:javascript
复制
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来防止多次单击:

代码语言:javascript
复制
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);
票数 3
EN

Stack Overflow用户

发布于 2014-05-28 19:43:46

我认为您需要使用自定义视图才能做到这一点,因为您不能在创建AlertDialog消息之后更新它。使用id为TextView的textView1创建一个自定义视图,使用id为progressBar1的ProgressBar创建一个自定义视图,然后创建以下类。

代码语言:javascript
复制
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);
    }
}

您还需要在其参数中传递文本字符串。

代码语言:javascript
复制
DialogFragment dialog = new MyDialogFragment();
Bundle args = new Bundle();
args.putString("text", text);
dialog.setArguments(args);
dialog.show(getFragmentManager(), "my_dialog")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23920094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档