Приложение вылетает при попытке открыть диалоговое окно - PullRequest
0 голосов
/ 01 августа 2020

У меня есть кнопка в макете активности. При нажатии кнопки появляется диалоговое окно. Когда я нажимаю за пределами диалога, диалог исчезает. (У меня нет проблем с этой проблемой).

Но когда я снова нажимаю на кнопку, я ожидаю, что диалоговое окно появится снова, но вместо этого произойдет сбой приложения.

I я просто играю с диалогами, чтобы реализовать его в моем реальном приложении

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)

Код моей активности:

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

У меня есть следующий код в строке 40 моего кода: builder.show();

Я хочу знать, почему я получаю эту ошибку, а также как ее решить.

Изображение диалогового окна (и макет) : введите описание изображения здесь

Ответы [ 3 ]

2 голосов
/ 01 августа 2020

Эта проблема возникает из-за того, что spinner уже прикреплен к предыдущему диалогу или в другом слове имеет родительский элемент. Вы должны создавать его каждый раз, когда хотите показать свой диалог:

        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();
            }
        });
0 голосов
/ 01 августа 2020

Попробуйте это.

объявите свой 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):

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");
            spinner = new Spinner(this);
            spinner.setAdapter(adapter);
            builder.setView(spinner);
            builder.show();
        }
    });
0 голосов
/ 01 августа 2020

скорректируйте свой код.

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

Кстати, это ужасный способ сделать это.

...