Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 应用程序在尝试弹出对话框时崩溃_Android_Android Dialog - Fatal编程技术网

Android 应用程序在尝试弹出对话框时崩溃

Android 应用程序在尝试弹出对话框时崩溃,android,android-dialog,Android,Android Dialog,我的活动布局中有一个按钮。单击按钮时,会弹出一个对话框。当我在对话框边界外点击时,对话框消失。(我对这个问题没有任何问题) 但当我再次点击按钮时,我希望对话框再次弹出,但应用程序却崩溃了 我只是在玩对话框,以便在我真正的应用程序中真正实现它 我的堆栈跟踪: 2020-08-01 12:00:33.377 9333-9333/com.example.spinner E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.spinne

我的活动布局中有一个按钮。单击按钮时,会弹出一个对话框。当我在对话框边界外点击时,对话框消失。(我对这个问题没有任何问题)

但当我再次点击按钮时,我希望对话框再次弹出,但应用程序却崩溃了

我只是在玩对话框,以便在我真正的应用程序中真正实现它

我的堆栈跟踪:

2020-08-01 12:00:33.377 9333-9333/com.example.spinner E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.spinner, PID: 9333
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
    at android.view.ViewGroup.addViewInner(ViewGroup.java:4941)
    at android.view.ViewGroup.addView(ViewGroup.java:4772)
    at android.view.ViewGroup.addView(ViewGroup.java:4744)
    at androidx.appcompat.app.AlertController.setupCustomContent(AlertController.java:657)
    at androidx.appcompat.app.AlertController.setupView(AlertController.java:475)
    at androidx.appcompat.app.AlertController.installContent(AlertController.java:233)
    at androidx.appcompat.app.AlertDialog.onCreate(AlertDialog.java:279)
    at android.app.Dialog.dispatchOnCreate(Dialog.java:403)
    at android.app.Dialog.show(Dialog.java:302)
    at androidx.appcompat.app.AlertDialog$Builder.show(AlertDialog.java:1009)
    at com.example.spinner.MainActivity$1.onClick(MainActivity.java:40)
    at android.view.View.performClick(View.java:6304)
    at android.view.View$PerformClick.run(View.java:24803)
    at android.os.Handler.handleCallback(Handler.java:794)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:176)
    at android.app.ActivityThread.main(ActivityThread.java:6651)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)
我的活动代码:

public class MainActivity extends AppCompatActivity {
    private Spinner spinner;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ArrayList<String> avc = new ArrayList<String>();
        avc.add("sb");
        avc.add("eerig");
        avc.add("sb");
        avc.add("eerig");
        avc.add("sb");
        avc.add("eerig");
        avc.add("sb");
        avc.add("eerig");
        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, avc);
        spinner = new Spinner(this);
        spinner.setAdapter(adapter);

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setTitle("abc");
                builder.setMessage("abcde");
                builder.setView(spinner);
                builder.show();
            }
        });
    }
}
public类MainActivity扩展了AppCompatActivity{
私人纺纱机;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList avc=新的ArrayList();
avc.添加(“sb”);
avc.添加(“GERIG”);
avc.添加(“sb”);
avc.添加(“GERIG”);
avc.添加(“sb”);
avc.添加(“GERIG”);
avc.添加(“sb”);
avc.添加(“GERIG”);
ArrayAdapter=新的ArrayAdapter(这是android.R.layout.simple\u微调器\u下拉菜单\u项,avc);
微调器=新微调器(此);
旋转器。设置适配器(适配器);
findviewbyd(R.id.button).setOnClickListener(新视图.OnClickListener()){
@凌驾
公共void onClick(视图v){
AlertDialog.Builder=新建AlertDialog.Builder(MainActivity.this);
建造商名称(“abc”);
builder.setMessage(“abcde”);
builder.setView(微调器);
builder.show();
}
});
}
}
我在代码的第40行有以下代码:
builder.show()

我想知道为什么我会出现这个错误,以及如何解决它


对话框图片(和布局):

发生此问题的原因是
微调器
已附加到上一个对话框,或者换句话说,它具有父对象。 您应该在每次显示对话框时创建它:

findviewbyd(R.id.button).setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
AlertDialog.Builder=新建AlertDialog.Builder(MainActivity.this);
建造商名称(“abc”);
builder.setMessage(“abcde”);
ArrayAdapter=新的ArrayAdapter(这是android.R.layout.simple\u微调器\u下拉菜单\u项,avc);
微调器=新微调器(此);
旋转器。设置适配器(适配器);
builder.setView(微调器);
builder.show();
}
});
调整代码

findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            mSpinner = new Spinner(this);
            mSpinner.setAdapter(adapter);
    
            AlertDialog.Builder builder = new 
            AlertDialog.Builder(MainActivity.this);
            builder.setTitle("abc");
            builder.setMessage("abcde");
            builder.setView(mSpinner);
            builder.show();
            }
       });
顺便说一句,这样做很糟糕。

试试这个

在微调器声明下方声明ArrayAdapter:

public class MainActivity extends AppCompatActivity {
private Spinner spinner;
private ArrayAdapter adapter;
然后在onCreate中对其进行初始化:

adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, avc);
最后,将此代码移动到onClick(onClick内部):

像这样:

findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("abc");
            builder.setMessage("abcde");
            spinner = new Spinner(this);
            spinner.setAdapter(adapter);
            builder.setView(spinner);
            builder.show();
        }
    });

因此,当第二次弹出对话框并尝试将微调器添加到自身时,它会抛出一个错误,因为微调器已经有一个父级?无需重新创建阵列适配器实例,您只需要微调器新对象。您是否可以指定为什么这样做很糟糕?您在单击时多次创建警报对话框实例,为什么不在每次单击时创建一个自定义对话框,以使用同一对话框实例替换文本。因此,为您节省了不必要的obj创建。对不起,我不明白您的实际意思。你是说我应该在别的地方实例化alertDialog吗?
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("abc");
            builder.setMessage("abcde");
            spinner = new Spinner(this);
            spinner.setAdapter(adapter);
            builder.setView(spinner);
            builder.show();
        }
    });