Android使用AlertDialog实现弹出菜单的详细过程
作者:阿迷创客
在Android经常会用到AlertDialog,下面这篇文章主要给大家介绍了关于Android使用AlertDialog实现弹出菜单的详细过程,文中通过代码介绍的非常详细,需要的朋友可以参考下
前言
最近又开始捣鼓APP,许多api , class都忘记怎么用了,楼下使用AlertDialog实现个弹出菜单,结果直接crash,查了半天,终于即将,记录一下……
1 实现代码
AlertDialog.Builder mBuilder = new AlertDialog.Builder(mContext);//will be crash: android.content.res.Resources$NotFoundException: Resource ID #0x0 mBuilder = new AlertDialog.Builder(this); //填充列表数据 final String[] items = new String[]{"选项1", "选项2", "选项3"}; mBuilder.setTitle("选择一项"); // 设置标题 mBuilder.setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Toast.makeText(mContext, "clicked:"+ items[which], Toast.LENGTH_SHORT).show(); } }); mBtnApp6.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 创建并显示对话框 mBuilder.create().show();//界面上mBtnApp6按钮点击后执行dialog显示 } });
2 实现效果
3 增加数据项的效果
4 遇到的错误
- android.content.res.Resources$NotFoundException: Resource ID #0x0
- 原因:new AlertDialog.Builder(mContext) , crash
或 new AlertDialog.Builder(getApplicationContext()) , crash
- 解决办法:new AlertDialog.Builder(this), OK
--------- beginning of crash 04-18 17:08:40.940 6011 6011 E AndroidRuntime: FATAL EXCEPTION: main 04-18 17:08:40.940 6011 6011 E AndroidRuntime: Process: com.cictech.xlauncher, PID: 6011 04-18 17:08:40.940 6011 6011 E AndroidRuntime: android.content.res.Resources$NotFoundException: Resource ID #0x0 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:237) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.content.res.Resources.loadXmlResourceParser(Resources.java:2400) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.content.res.Resources.getLayout(Resources.java:1252) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:530) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:479) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at androidx.appcompat.app.AlertController$AlertParams.createListView(AlertController.java:989) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at androidx.appcompat.app.AlertController$AlertParams.apply(AlertController.java:965) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at androidx.appcompat.app.AlertDialog$Builder.create(AlertDialog.java:984) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at com.cictech.xlauncher.MainActivity$7.onClick(MainActivity.java:188) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.View.performClick(View.java:7448) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.View.performClickInternal(View.java:7425) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.View.onKeyUp(View.java:15060) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.KeyEvent.dispatch(KeyEvent.java:2892) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.View.dispatchKeyEvent(View.java:14247) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1954) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1959) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1959) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1959) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1959) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1959) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1959) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at com.android.internal.policy.DecorView.superDispatchKeyEvent(DecorView.java:476) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1861) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.app.Activity.dispatchKeyEvent(Activity.java:4085) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.java:126) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:86) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.java:144) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:604) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:60) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:3413) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:390) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:5977) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5845) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5340) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5397) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5363) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5515) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5371) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5572) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5344) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5397) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5363) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5371) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5344) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5397) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5363) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5548) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:5706) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:3179) 04-18 17:08:40.940 6011 6011 E AndroidRuntime: at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2721) 04-18 17:08:40.943 6011 6011 E AndroidRuntime: at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2712) 04-18 17:08:40.943 6011 6011 E AndroidRuntime: at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:3156) 04-18 17:08:40.943 6011 6011 E AndroidRuntime: at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:143) 04-18 17:08:40.943 6011 6011 E AndroidRuntime: at android.os.MessageQueue.nativePollOnce(Native Method) 04-18 17:08:40.943 6011 6011 E AndroidRuntime: at android.os.MessageQueue.next(MessageQueue.java:335) 04-18 17:08:40.943 6011 6011 E AndroidRuntime: at android.os.Looper.loop(Looper.java:183) 04-18 17:08:40.943 6011 6011 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:7695) 04-18 17:08:40.943 6011 6011 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 04-18 17:08:40.943 6011 6011 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 04-18 17:08:40.943 6011 6011 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 04-18 17:08:40.947 2569 2813 D AudioFlinger: mixer(0xabae2080) throttle end: throttle time(45) 04-18 17:08:40.964 2774 3534 W ActivityTaskManager: Force finishing activity com.cictech.xlauncher/.MainActivity
附:Android中用两层AlertDialog来进行弹出选择框信息选择
在Android经常会用到AlertDialog,把内容使用AlertDialog结合列表的形式显示出来,然后我们点击得到点击的信息。 这里可以使用两层的AlertDialog来实现
1:我们现在xml文件中定义一个要显示内容列表数组
2:在Activity中使用 String[] items = getResources().getStringArray(R.array.item);
3:增添点击事件,使用Alertdialog.builder 千万不能忘了最后进行show()哦
直接看截图的效果:
源代码:
package com.jiangqq.alertdialog; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; /** * 使用AlertDialog进行选择功能 * * @author jiangqq * */ public class AlertDialogActivity extends Activity { private Button btn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { final String[] items = getResources().getStringArray( R.array.item); new AlertDialog.Builder(AlertDialogActivity.this) .setTitle("请点击选择") .setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { new AlertDialog.Builder( AlertDialogActivity.this) .setTitle("你选择了:" + items[which]) .setMessage("点击选择操作") .setPositiveButton( "确定", new DialogInterface.OnClickListener() { public void onClick( DialogInterface dialog, int which) { // 这里是你点击确定之后可以进行的操作 } }) .setNegativeButton( "取消", new DialogInterface.OnClickListener() { public void onClick( DialogInterface dialog, int which) { // 这里点击取消之后可以进行的操作 } }).show(); } }).show(); } }); } }
string.xml文件内容:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, AlertDialogActivity!</string> <string name="app_name">Hello World, AlertDialogActivity</string> <string name="btn_name">点击弹出AlertDialog</string> <string-array name="item"> <item>第一个选择</item> <item>第二个选择</item> <item>第三个选择</item> <item>第四个选择</item> </string-array> </resources>
总结
到此这篇关于Android使用AlertDialog实现弹出菜单的文章就介绍到这了,更多相关Android AlertDialog实现弹出菜单内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!