如何在android中的MainActivity外创建一个对话框

时间:2018-02-08 07:33:46

标签: java android android-alertdialog

我想在我的Android应用中插入警告对话框。 我按照教程将其添加到一个简单的项目中时很好,该项目只有MainActivity.javaactivity_main.xmllayout xml。

但是,当我想将代码插入到我的项目中时,我会遇到一些问题。 我的代码是:

android.app.AlertDialog alartDialog = new android.app.AlertDialog.Builder(this)
                        .setTitle("Exit?")
                        .setMessage("Are you sure want to QUIT ?")
                        .setPositiveButton("yes", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                pmaControllerManager.OnExit();
                            }
                        })
                        .setNegativeButton("no", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int i) {
                                dialog.cancel();
                            }
                        })
                        .setNeutralButton("cancel", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                dialogInterface.cancel();
                            }
                        })
                        .show();

第一行的 this 中有一个警告符号。 我该怎么办呢? 附:下面是我调用 showDialog 的功能(我在按钮[5]中调用它):

private void setbutton()
{
    buttons[0]=(ImageButton)menu.findViewById(R.id.button0);
    buttons[1]=(ImageButton)menu.findViewById(R.id.button1);
    buttons[2]=(ImageButton)menu.findViewById(R.id.button2);
    buttons[3]=(ImageButton)menu.findViewById(R.id.button3);
    buttons[4]=(ImageButton)menu.findViewById(R.id.button4);
    buttons[5]=(ImageButton)menu.findViewById(R.id.button5);

    buttons[1].setBackgroundResource(R.drawable.screen);
    buttons[2].setBackgroundResource(R.drawable.sketch);
    buttons[3].setBackgroundResource(R.drawable.importdraw);
    buttons[4].setBackgroundResource(R.drawable.setting);
    buttons[5].setBackgroundResource(R.drawable.out);
    center.setBackgroundResource(R.drawable.noticeicon_using);

    /*center.setOnClickListener(new ImageButton.OnClickListener(){
        @Override
        public void onClick(View v) {
            if(click)
            {
                closemenu();
                //mode=false;
            }
            else
            {
                openmenu();
                //mode=true;
            }
            click=!click;
        }
    });*/
    center.setOnTouchListener(new View.OnTouchListener() {
        boolean isMove=false;
        int touchy,touchx,y;
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            int action=motionEvent.getAction();
            if(action==MotionEvent.ACTION_DOWN)
            {
                y=params.y;
                //Log.i("y:",String.valueOf(y));
                touchy=(int)motionEvent.getRawY();
                touchx=(int)motionEvent.getRawX();
            }
            else if(action==MotionEvent.ACTION_MOVE)
            {
                if(Math.abs(motionEvent.getRawX()-touchx)<30)
                {
                    isMove=true;
                    params.gravity=Gravity.RIGHT;
                    params.y=y+(int)motionEvent.getRawY()-touchy;
                    wm.updateViewLayout(center,params);
                    wm.updateViewLayout(menu,params);
                }
            }
            else if(action==MotionEvent.ACTION_UP)
            {
                if(!isMove)
                {
                    if(click)
                    {
                        closemenu();
                        //mode=false;
                    }
                    else
                    {
                        openmenu();
                        //mode=true;
                    }
                    click=!click;
                }
                else
                    isMove=false;

            }
            return true;
        }
    });

    buttons[1].setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction()==MotionEvent.ACTION_DOWN)
                buttons[1].setBackgroundResource(R.drawable.screen_focus);
            else if(event.getAction()==MotionEvent.ACTION_UP)
            {
                buttons[1].setBackgroundResource(R.drawable.screen);
                pmaControllerManager.newTask("screen");
            }
            return true;
        }
    });
    buttons[2].setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction()==MotionEvent.ACTION_DOWN)
                buttons[2].setBackgroundResource(R.drawable.sketch_focus);
            else if(event.getAction()==MotionEvent.ACTION_UP)
            {
                buttons[2].setBackgroundResource(R.drawable.sketch);
                pmaControllerManager.newTask("sketch");
            }
            return true;
        }
    });
    buttons[3].setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction()==MotionEvent.ACTION_DOWN)
                buttons[3].setBackgroundResource(R.drawable.importdraw_focus);
            else if(event.getAction()==MotionEvent.ACTION_UP)
            {
                buttons[3].setBackgroundResource(R.drawable.importdraw);
            }
            return true;
        }
    });
    buttons[4].setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction()==MotionEvent.ACTION_DOWN)
                buttons[4].setBackgroundResource(R.drawable.setting_focus);
            else if(event.getAction()==MotionEvent.ACTION_UP)
            {
                buttons[4].setBackgroundResource(R.drawable.setting);
                pmaControllerManager.Setting();
            }
            return true;
        }
    });
    buttons[5].setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction()==MotionEvent.ACTION_DOWN)
                buttons[5].setBackgroundResource(R.drawable.exit_focus);
            else if(event.getAction()==MotionEvent.ACTION_UP)
            {
                buttons[5].setBackgroundResource(R.drawable.out);
                shoaDialog(menuwindow.this);
                pmaControllerManager.OnExit();
            }
            return true;
        }
    });
}

4 个答案:

答案 0 :(得分:1)

通过Context代替this,因为this是对当前对象的引用。这意味着如果你从lambda this调用它将是一个从匿名类扩展的对象的引用。

所以你可以制作类似

的方法
public void showDialog(Context context) {
    AlertDialog alartDialog = AlertDialog.Builder(context).
           ...
           .show();
}

然后将其称为

showDialog(MainActivity.this); //for activity
showDialog(MainFragment.this.getActivity()); //for fragment

顺便说一下,为它制作类似于Util的东西:

class DialogUtil {
   public static void showDialog(Context context) {
             AlertDialog alartDialog = AlertDialog.Builder(context).
           ...
           .show();
   }
}

然后将其称为

DialogUtil.showDialog(MainActivity.this); //for activity
DialogUtil.showDialog(MainFragment.this.getActivity()); //for fragment

更新

而不是像以下那样称呼它:

shoaDialog(menuwindow.this);

您可以按上述方式传递Context,也可以从View中获取

buttons[5].setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    //some code here
        showDialog(v.getContext());
        return true;
    }
});

答案 1 :(得分:0)

this替换为MainActivity.this,例如:

  

android.app.AlertDialog alartDialog = new   android.app.AlertDialog.Builder(MainActivity.this)

答案 2 :(得分:0)

this替换为MainActivity.thisgetApplicationContext()

android.app.AlertDialog alartDialog = new android.app.AlertDialog.Builder(MainActivity.this)

如果您正在使用对话框,请查看以下内容:

活动: ActivityName.this

android.app.AlertDialog alartDialog = new android.app.AlertDialog.Builder(MainActivity.this)

片段: getActivity()

 android.app.AlertDialog alartDialog = new android.app.AlertDialog.Builder(getActivity())

适用于适配器: Context context;

android.app.AlertDialog alartDialog = new android.app.AlertDialog.Builder(context)

另外,请查看此Difference between getContext() , getApplicationContext() , getBaseContext() and "this"

答案 3 :(得分:0)

AltertDialog需要一个上下文,你正在传递它的活动。尝试使用

new android.app.AlertDialog.Builder(this.getApplicationContext())

代替。