android - 我正在尝试在点击视图时打开一个对话框
问题描述
我试图在点击视图时打开一个对话框。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)
解决方案
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();
推荐阅读
- rest - 使用非拉丁字符的 A1 表示法访问 Google 表格中的值
- visual-studio-code - 一次打开两个侧边栏标签与代码
- asp.net - Facebook Adobe Flash 警告
- sql - 使用书签但从表单而不是 tbl 或 qry 访问 Word
- sql - SQL - 比较 2 个表并显示不存在的数据
- java - java 是否有与 pascal(type record...end) 相同的东西来对数据进行排序?
- c - 代码执行“延迟”从何而来?
- c# - Newtonsoft.Json.JsonSerializationException “无法反序列化当前 JSON 对象”
- angular - 让 npm 缓存适用于 azure devops 中的 .net core angular 项目
- sed - 如何防止在 sed 中被后续的 s///(替换的空模式)替换?