尝试弹出对话框时应用程序崩溃
App crashes while trying popping up a dialog
我的 activity 布局中有一个按钮。单击该按钮时,会弹出一个对话框。当我点击对话框边界外时,对话框消失。 (我对这个问题没有任何问题)。
但是当我再次点击按钮时,我希望对话框再次弹出,但应用程序却崩溃了。
我只是在玩弄对话框以在我的真实应用程序中实际实现它
我的堆栈跟踪:
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.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)
我的activity代码:
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();
我想知道为什么会出现此错误以及如何解决它。
对话框图片(和布局):
发生此问题是因为 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();
}
});
调整您的代码。
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 内部):
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();
}
});
我的 activity 布局中有一个按钮。单击该按钮时,会弹出一个对话框。当我点击对话框边界外时,对话框消失。 (我对这个问题没有任何问题)。
但是当我再次点击按钮时,我希望对话框再次弹出,但应用程序却崩溃了。
我只是在玩弄对话框以在我的真实应用程序中实际实现它
我的堆栈跟踪:
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.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)
我的activity代码:
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();
我想知道为什么会出现此错误以及如何解决它。
对话框图片(和布局):
发生此问题是因为 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();
}
});
调整您的代码。
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 内部):
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();
}
});