经过检查,要求用户打开互联网服务,我试图点击一个按钮,我的应用程序崩溃的错误消息
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
在这一行它崩溃,我已经尝试这样做,但没有解决绝对
if(alert.getContext() != null){
alert.show();
}
这是完整的代码
else if (id == R.id.xyz) {
//startActivity(borrowIntent);
AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
alert.setTitle("xyz");
input.setFilters(new InputFilter[] {
// Maximum 2 characters.
new InputFilter.LengthFilter(6),
// Digits only.
DigitsKeyListener.getInstance(),
});
// Digits only & use numeric soft-keyboard.
input.setKeyListener(DigitsKeyListener.getInstance());
input.setHint("xyz");
alert.setView(input);
alert.setPositiveButton("Borrow", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
if(input.getText().length() == 0)
{
input.setError("xyz is required !");
}
else
{
if(isNetworkAvailable())
{
xyz( input.getText().toString());
}else{
//setContentView(R.layout.main);
AlertDialog.Builder builder = new AlertDialog.Builder(
MainActivity.this);
builder.setCancelable(false);
builder.setTitle("xyz");
builder.setMessage("Please enable wifi services");
builder.setInverseBackgroundForced(true);
builder.setPositiveButton("Ok",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
startActivityForResult(new Intent(android.provider.Settings.ACTION_SETTINGS), 0);
dialog.dismiss();
}
});
AlertDialog alerts = builder.create();
alerts.show();
}//end of block
}
}
});
alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// Canceled.
}
});
if(alert.getContext() != null){
alert.show(); //crashes at this line
}
}
拜托,我错过了什么?
5条答案
按热度按时间798qvoo81#
问题出在这一行:
alert.setView(input);
您添加的input
View
已经有parent
。创建新的input
示例。66bbxpm52#
根据这个post,添加这个检查以从其父节点中删除输入并重新读取它:
np8igboo3#
放置以下行
之后
rbpvctlc4#
以下情况也可能发生(发生在我身上):
有时当你使用一个列表视图时,你会用一个适配器初始化它,它属于某个布局。现在让我们假设这个布局文件的根视图是一个id为“root_view”的
<LinearLayout>
。如果您现在在activity中注册上下文菜单并创建一个
AlerdDialog.Builder
,它在选择某个菜单元素后出现,并使用布局文件对其进行初始化,该布局文件也有一个ID为“root_view”的根元素,其中所有属于您的AlertDialog
的元素都是它的子元素,那么这些元素“将不会被找到”。您将无法使用findViewById
访问这些元素,相反,您只能从列表视图的<LinearLayout>
中访问元素,并且在调用builder.show()
的行中得到相同的错误消息(或者在这里是alert.show()
)。因此,通常情况下,为您的项目唯一地命名布局文件中元素的id是一个好主意。
myzjeezk5#
我忘记在
AlertDialog.Builder
上调用create()
。当你调用show()
而不调用create()
方法时,AlertDialog
示例被创建。这在第一次成功了,但随后的点击得到了IllegalStateException
。当我在我的onClickListener
内部调用show()
时,它将在每次单击按钮时创建一个新的AlertDialog
示例。