【问题标题】:How to call alertDialog in alertDialog?如何在 alertDialog 中调用 alertDialog?
【发布时间】:2015-03-24 07:00:46
【问题描述】:

我在 android 中有一个从 javascript 界面调用的警报对话框。 在警报对话框中,我有两个按钮,当您单击其中一个按钮时,我想启动其他包含列表的警报对话框。但是当我单击应用程序崩溃时。 这是我的java代码:

public void SaveDialog(final String SaveID) {

    final SQLiteDatabase mydatabase1 = openOrCreateDatabase("CopyCollection", MODE_PRIVATE, null);
    Cursor c = mydatabase1.rawQuery("SELECT * FROM Details WHERE ID="+SaveID+";", null);
    if(c.moveToFirst()) {

        do {

            appName = c.getString(1);
            txtClip = c.getString(2);
            text_Date = c.getString(3);
        } while (c.moveToNext());
    }
    AlertDialog.Builder myDialog = new AlertDialog.Builder(AndroidHTMLActivity.this);
    myDialog.setTitle("ذخیره");
    myDialog.setPositiveButton("ذخیره", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {

            //======================================================
            String names[] ={"A","B","C","D"};
            final AlertDialog.Builder alertDialog = new AlertDialog.Builder(AndroidHTMLActivity.this);
            LayoutInflater inflater = getLayoutInflater();
            View convertView = (View) inflater.inflate(R.layout.main, null);
            alertDialog.setView(convertView);
            alertDialog.setTitle("List");
            ListView lv = (ListView) convertView.findViewById(R.id.listView1);
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(AndroidHTMLActivity.this,android.R.layout.simple_list_item_1,names);
            lv.setAdapter(adapter);
            alertDialog.show();
        }
    });
    myDialog.setNegativeButton("اشتراک گذاری", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {

            Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
            sharingIntent.setType("text/plain");
            String shareBody = txtClip;
            sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Subject");
            sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
            startActivity(Intent.createChooser(sharingIntent, "Share via"));
        }
    });
    myDialog.show();
}

这是 logcat:

03-24 02:22:58.146    5499-5499/com.exercise.AndroidHTML W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xb0cf3b20)03-24 02:22:58.156    5499-5499/com.exercise.AndroidHTML E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.exercise.AndroidHTML, PID: 5499
java.lang.IllegalStateException: Calling View methods on another thread than the UI thread.
        at com.android.webview.chromium.WebViewChromium.createThreadException(WebViewChromium.java:268)
        at com.android.webview.chromium.WebViewChromium.checkThread(WebViewChromium.java:284)
        at com.android.webview.chromium.WebViewChromium.setLayoutParams(WebViewChromium.java:1618)
        at android.webkit.WebView.setLayoutParams(WebView.java:2099)
        at android.view.ViewGroup.addViewInner(ViewGroup.java:3577)
        at android.view.ViewGroup.addView(ViewGroup.java:3415)
        at android.view.ViewGroup.addView(ViewGroup.java:3391)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:759)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
        at com.exercise.AndroidHTML.AndroidHTMLActivity$MyJavaScriptInterface.SaveDialog(AndroidHTMLActivity.java:198)
        at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
        at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.os.HandlerThread.run(HandlerThread.java:61)

【问题讨论】:

    标签: java javascript android webview


    【解决方案1】:

    JavaScript 在主线程之外的单独线程上运行,您不能直接在主线程上显示对话框。相反,您可以按如下方式显示您的对话框:

    首先,在MyJavaScriptInterface 类中添加一个方法:

    public void showDialog(final String SaveID){
        // create a Handler with the main Looper and 
        // post the dialog showing work to main thread.
        new Handler(Looper.getMainLooper()).post(new Runnable(){
            SaveDialog(SaveID);
        });
    }
    

    然后,调用 showDialog() 方法而不是 SaveDialog()。

    【讨论】:

    • 我在哪里设置这个处理程序?
    • @user3001854 在 MyJavaScriptInterface 类中。
    • 抱歉,我无法修复它,你是解释得更多还是给我看一些例子?
    • @user3001854 你说你不能修复它是什么意思?您不知道如何更改代码,或者您可以更改它但仍然崩溃? logcat是一样的吗?
    • 不知道怎么改
    猜你喜欢
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多