在 onItemLongClick 中显示 AlertDialog 会给出有关父项的错误,我必须做什么?

Showing a AlertDialog in a onItemLongClick is giving a error about the parent what I have to do?

我试图在用户执行 onItemLongClick 列表视图时显示一个对话框以确认用户是否想要这样做,但在 adb.show():

The specified child already has a parent. You must call removeView() on the child's parent first

使用以下代码:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

            AlertDialog.Builder adb = new AlertDialog.Builder(getBaseContext());
            adb.setView(view);
            adb.setTitle("Title of alert dialog");
            adb.setIcon(android.R.drawable.ic_dialog_alert);
            adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                    Toast.makeText(Menu.this, "OK", Toast.LENGTH_LONG).show();
                } });

            adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(Menu.this, "cancel", Toast.LENGTH_LONG).show();
                    //finish();
                } });
            adb.show();

            return true;
        }
    });

我搜索了答案,但我没有看到有关 listview 或 longclick 的信息,所以我需要帮助:(

添加了 logcat,报错的那一行就是出现adb.show();:

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:3936)
at android.view.ViewGroup.addView(ViewGroup.java:3786)
at android.view.ViewGroup.addView(ViewGroup.java:3758)
at com.android.internal.app.AlertController.setupView(AlertController.java:492)
at com.android.internal.app.AlertController.installContent(AlertController.java:236)
at android.app.AlertDialog.onCreate(AlertDialog.java:356)
at android.app.Dialog.dispatchOnCreate(Dialog.java:373)
at android.app.Dialog.show(Dialog.java:274)
at android.app.AlertDialog$Builder.show(AlertDialog.java:993)
at pt.isec.jogodememoria.MenuEscolheNivel.onItemLongClick(MenuEscolheNivel.java:119)
at android.widget.AbsListView.performLongPress(AbsListView.java:3121)
at android.widget.AbsListView$CheckForLongPress.run(AbsListView.java:3070)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

一个很容易犯的错误,缺少这个 AlertDialog alertDialog = adb.create(); 并且不需要 setView。您仍然可以创建一个单独的方法并为每次长时间的项目点击实例化它。

listView.setOnItemLongClickListener(new AdapterView
            .OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

        createDialog(view);
        return true;
    }
});

然后为您的对话框创建一个单独的方法:

public void createDialog(View view){

   AlertDialog.Builder adb = new AlertDialog.Builder(this);
    //adb.setView(Main.this);
    adb.setTitle("Title of alert dialog");
    adb.setIcon(android.R.drawable.ic_dialog_alert);
    adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {

            Toast.makeText(getApplicationContext(), "OK", Toast.LENGTH_LONG).show();
        } });

    adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(getApplicationContext(), "cancel", Toast.LENGTH_LONG).show();
            //finish();
        } });

    AlertDialog alertDialog = adb.create();
    alertDialog.show();

}

我认为那行

adb.setView(view);

错了。

因为您正在尝试将项目视图 (view) 设置为您的 Dialog 主视图。 如果您评论这些行,代码应该可以工作。

你应该改变这一行

adb.show();

由此

AlertDialog dialog = adb.create();
dialog.show();

并通过 YourActivity.this 或 getActivity() 更改您的上下文 (getBaseContext())。

此致。

先试试这个

  listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                
                showDialog(view);
    
           return true;
            }
        });
    
    
        private void showDialog(View view) {
    
            AlertDialog.Builder adb = new AlertDialog.Builder(this);
                adb.setView(view);//try it first with this line if it doesnt work delete it 
                adb.setTitle("Title of alert dialog");
                adb.setIcon(android.R.drawable.ic_dialog_alert);
                adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
    
                        Toast.makeText(Menu.this, "OK", Toast.LENGTH_LONG).show();
                    } });
    
                adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(Menu.this, "cancel", Toast.LENGTH_LONG).show();
                        //finish();
                    } });
                
                adb.create().show();
        }

如果它没有解决,那么创建一个自定义布局,其中只包含对话框的主体,然后试试这个:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                    
                    showDialog(view);
        
               return true;
                }
            });

  private void showDialog() {
        // TODO Auto-generated method stub
        LayoutInflater inflater = this.getLayoutInflater();

        final View customview = inflater.inflate(
                R.layout.your_dialog_layout, null);

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setView(customview);
        builder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            
        });
        builder.setNegativeButton("Cancel",
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // TODO Auto-generated method stub

                    }
                });
        Dialog dialog = builder.create();
        dialog.show();
    }

希望对您有所帮助:)

是因为您正在尝试使用具有父视图的视图,正如您所见,您不能这样做。最好的方法是用你想要的相同布局膨胀另一个视图。

尝试使用其他布局,但内容相同:

然后:

final AlertDialog.Builder adb = new AlertDialog.Builder(getBaseContext());
View newView = View.inflate(getBaseContext(),R.layout.my_layout,null);
adb.setView(newView);
adb.setTitle("Title of alert dialog");
adb.setIcon(android.R.drawable.ic_dialog_alert);
adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
  public void onClick(DialogInterface dialog, int which) {
    Toast.makeText(Menu.this, "OK", Toast.LENGTH_LONG).show();
  }
});

adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
  public void onClick(DialogInterface dialog, int which) {
    Toast.makeText(Menu.this, "cancel", Toast.LENGTH_LONG).show();
    //finish();
  }
});

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
  @Override
  public boolean onItemLongClick(AdapterView < ? > parent, View view, int position, long id) {

    adb.show();
    return true;
  }
});