我正在尝试使用ListView创建一个AlertDialog,但是如果我第二次选择AlertDialog,那么应用程序崩溃会给我这个错误
e/androidruntime:致命例外:主要 过程:wishautomatic.com.wishautomatic,pid:5342 java.lang.illegalstateException:指定的孩子已经有父母。您必须在孩子的父母上调用removeview(( 第一的。 at android.view.viewgroup.addviewinner(viewGroup.java:3880( at android.view.viewgroup.addview(viewgroup.java:3733( at android.view.viewgroup.addview(viewgroup.java:3709( 在com.android.internal.app.alertcontroller.setupview(alertcontroller.java:490( 在com.android.internal.app.alertcontroller.installcontent(AlertController.java:234( at android.app.alertdialog.oncreate(alertdialog.java:356( at android.app.dialog.dispatchonCreate(dialog.java:373( at android.app.dialog.show(dialog.java:274( 在wishautomatic.com.wishautomatic.createwishfragment $ getwishmessages.onpostexecute(createwishfragment.java:559( 在wishautomatic.com.wishautomatic.createwishfragment $ getwishmessages.onpostexecute(createwishfragment.java:461( 在android.os.asynctask.finish(asynctask.java:632( at android.os.asynctask.access $ 600(asynctask.java:177( at android.os.asynctask $ internalHandler.HandleMessage(asynctask.java:645( at android.os.handler.dispatchmessage(Handler.java:102( at android.os.looper.loop(looper.java:135( at android.app.activitythread.main(activityThread.java:5221( 在java.lang.reflect.method.invoke(本机方法(上 在java.lang.reflect.method.invoke(method.java:372( 在com.android.internal.os.os.zygoteinit $ methodandargscaller.run(zygoteinit.java:899( 在com.android.internal.os.os.zygoteinit.main(zygoteinit.java:694(
@Override
protected void onPostExecute(String result) {
//Toast.makeText(getActivity(),result,Toast.LENGTH_LONG).show();
msg=messagess.toArray(msg);
dialog.dismiss();
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(listView);
/**@Override
public void onClick(DialogInterface dialogInterface, int i) {
//Toast.makeText(getActivity(),msg[i],Toast.LENGTH_LONG).show();
Toast.makeText(getActivity(), "Wish message selected", Toast.LENGTH_SHORT).show();
WishMessage.setText(msg[i]);
}
});**/
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
ViewGroup vg =(ViewGroup)view;
TextView txt=(TextView)vg.findViewById(R.id.textViewWishMessage);
Toast.makeText(getActivity(),txt.getText().toString(),Toast.LENGTH_SHORT).show();
WishMessage.setText(txt.getText().toString());
}
});
builder.setNegativeButton("BACK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
AlertDialog alertDialog = builder.create();
alertDialog.setTitle("Select a wish message");
alertDialog.setCancelable(false);
alertDialog.show();
}
}
我将AlertDialog创建代码更改为这样的方法,
public class CreateWishFragment extends Fragment {
AlertDialog alertDialog;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
alertDialog=builder.create();
builder.setView(listView);
alertDialog.setTitle("Select a wish message");
alertDialog.setCancelable(true);
if (savedInstanceState!=null){
wishfor=savedInstanceState.getString("wishfor");
WishFor.setText(wishfor);
}
}
@Override
protected void onPostExecute(String result) {
//Toast.makeText(getActivity(),result,Toast.LENGTH_LONG).show();
msg=messagess.toArray(msg);
dialog.dismiss();
//builder.setView(listView);
alertDialog.show();
/**@Override
public void onClick(DialogInterface dialogInterface, int i) {
//Toast.makeText(getActivity(),msg[i],Toast.LENGTH_LONG).show();
Toast.makeText(getActivity(), "Wish message selected", Toast.LENGTH_SHORT).show();
WishMessage.setText(msg[i]);
}
});**/
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
ViewGroup vg =(ViewGroup)view;
TextView txt=(TextView)vg.findViewById(R.id.textViewWishMessage);
Toast.makeText(getActivity(),txt.getText().toString(),Toast.LENGTH_SHORT).show();
WishMessage.setText(txt.getText().toString());
if (alertDialog.isShowing()){
alertDialog.dismiss();
}
}
});
builder.setNegativeButton("BACK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
}
但是显示出这样的输出,警报对话框中没有什么它仅显示标题,而没有列表单击的图像
我想这是因为您再次重新创建相同的对话框(我相信onPostExecute
被称为几次(。
在您的onCreate
中构建一次,然后偶尔show
。
这也是一种更好的方法
如果您想以这种方式保留一切,我发现这可能会对您有所帮助!