首页 > 解决方案 > 我正在尝试在点击视图时打开一个对话框

问题描述

我试图在点击视图时打开一个对话框。MainActivity 类:

public class MainActivity extends AppCompatActivity {
    DialogInterface alertDialog1;
    ...
    public  void cangrats(){
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);

        builder.setTitle("Select Your Choice");
        builder.setPositiveButton("ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                builder.setCancelable(true);
            }});
        alertDialog1 = builder.create();
        builder.show();
    }
}

,迷宫类:

public class maze extends View {
    MainActivity mainActivity = new MainActivity();

    public maze(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN){
            mainActivity.cangrats();
        }

        return true;
    }
}

, 错误:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.blah.blah.myapplication, PID: 4435
                  java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
                      at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:149)
                      at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:157)
                      at android.support.v7.app.AlertDialog.resolveDialogTheme(AlertDialog.java:114)
                      at android.support.v7.app.AlertDialog$Builder.<init>(AlertDialog.java:294)
                      at com.blah.blah.myapplication.MainActivity.cangrats(MainActivity.java:17)
                      at com.blah.blah.myapplication.maze.onTouchEvent(maze.java:25)
                      at android.view.View.dispatchTouchEvent(View.java:9943)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2669)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2301)
                      at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:411)
                      at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1810)
                      at android.app.Activity.dispatchTouchEvent(Activity.java:3061)
                      at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:68)
                      at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:373)
                      at android.view.View.dispatchPointerEvent(View.java:10163)
                      at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4434)
                      at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4302)
                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
                      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902)
                      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868)
                      at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3995)
                      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876)
                      at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4052)
                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
                      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3902)
                      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3868)
                      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3876)
                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3849)
                      at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6210)
                      at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6184)
                      at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6145)
                      at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6313)
                      at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                      at android.os.MessageQueue.nativePollOnce(Native Method)
                      at android.os.MessageQueue.next(MessageQueue.java:323)
                      at android.os.Looper.loop(Looper.java:136)
                      at android.app.ActivityThread.main(ActivityThread.java:6077)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

标签: android

解决方案


You can you use static method for this and show your dialog
like this and also create your variable like this

 AlertDialog alertDialog1

 public static void cangrats(){
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);

    builder.setTitle("Select Your Choice");
    builder.setPositiveButton("ok", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            builder.setCancelable(true);
        }});
    alertDialog1 = builder.create();
    builder.show();
}

你在你的视图类中使用这个 MainActivity.cangrats();


推荐阅读