简体   繁体   English

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

[英]App crashes while trying popping up a dialog

I have a button in my activity layout.我的活动布局中有一个按钮。 When the button is clicked a dialog pops up.单击按钮时会弹出一个对话框。 When I tap outside the bounds of the dialog the dialog disappears.当我在对话框边界之外点击时,对话框消失。 (I do not have any problem with this issue). (我对这个问题没有任何问题)。

But when I click on the button again I expect the dialog to pop up again but the app crashes instead.但是,当我再次单击该按钮时,我希望对话框会再次弹出,但应用程序却崩溃了。

I am just playing around with dialogs to actually implement it in my real app我只是在玩对话框以在我的真实应用程序中实际实现它

My stacktrace:我的堆栈跟踪:

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)

My activity code:我的活动代码:

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

I have the following code at line 40 of my code: builder.show();我在代码的第 40 行有以下代码: builder.show();

I want to know why am I getting this error and also how to solve it.我想知道为什么会出现这个错误以及如何解决它。

Picture of the dialog (and layout):对话框图片(和布局): 在此处输入图像描述

This issue is happening because of that spinner which is already attached to the previous dialog or in another word has parent.发生此问题是因为该spinner已附加到上一个对话框或换句话说具有父级。 You should create it each time you want to show your dialog:每次要显示对话框时都应该创建它:

        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");
                ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, avc);
                spinner = new Spinner(this);
                spinner.setAdapter(adapter);
                builder.setView(spinner);
                builder.show();
            }
        });

adjust your code.调整你的代码。

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

By the way, this is terrible way to do this.顺便说一句,这是一种可怕的方法。

Try this.尝试这个。

declare your ArrayAdapter just below the spinner Declaration:在微调器声明下方声明您的 ArrayAdapter:

public class MainActivity extends AppCompatActivity {
private Spinner spinner;
private ArrayAdapter adapter;

and then initialize it in the onCreate:然后在 onCreate 中对其进行初始化:

adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, avc);

the lastly move this code to the onClick (inside onClick):最后将此代码移动到 onClick(在 onClick 内):

spinner = new Spinner(this);
spinner.setAdapter(adapter);

like this:像这样:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM