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()哦  

直接看截图的效果:
![](https://img2024.cnblogs.com/blog/1920990/202407/1920990-20240720204807897-413475674.gif)


![](https://img2024.cnblogs.com/blog/1920990/202407/1920990-20240720204801617-1450324947.gif)



源代码:      


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文件内容:    


<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>

```

总结
到此这篇关于Android使用AlertDialog实现弹出菜单的文章就介绍到这了,更多相关Android AlertDialog实现弹出菜单内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持vb.net教程C#教程python教程SQL教程access 2010教程xin3721自学网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中的弹出窗口可以通过使用对话框(Dialog)或者弹出菜单(Popup Menu)来实现。下面分别介绍一下这两种方式: 1. 对话框(Dialog): 对话框是一种常见的弹出窗口,可以用于显示信息、接收用户输入或进行选择操作。Android提供了几种不同类型的对话框,例如警告对话框、确认对话框和自定义对话框。 创建一个对话框的步骤如下: - 定义对话框的布局文件(例如dialog_layout.xml)。 - 在Activity中使用AlertDialog.Builder类来创建对话框,并设置相关属性。 - 通过调用show()方法显示对话框。 示例代码如下: ```java // 创建对话框 AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("提示"); builder.setMessage("这是一个对话框"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // 点击确定按钮时的操作 } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // 点击取消按钮时的操作 } }); AlertDialog dialog = builder.create(); dialog.show(); ``` 2. 弹出菜单(Popup Menu): 弹出菜单是一种轻量级的弹出菜单,可以用于显示一组选项供用户选择。Android提供了PopupMenu类来实现弹出菜单。 创建一个弹出菜单的步骤如下: - 在Activity中创建一个PopupMenu对象。 - 使用MenuInflater类将菜单资源文件(例如menu_popup.xml)加载到弹出菜单中。 - 通过调用show()方法显示弹出菜单。 示例代码如下: ```java // 创建弹出菜单 PopupMenu popupMenu = new PopupMenu(this, view); // view是触发弹出菜单的视图 MenuInflater inflater = popupMenu.getMenuInflater(); inflater.inflate(R.menu.menu_popup, popupMenu.getMenu()); // 设置菜单项点击事件 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { // 处理菜单项的点击事件 switch (item.getItemId()) { case R.id.menu_item1: // 执行操作1 return true; case R.id.menu_item2: // 执行操作2 return true; case R.id.menu_item3: // 执行操作3 return true; default: return false; } } }); // 显示弹出菜单 popupMenu.show(); ``` 以上是Android实现弹出窗口的两种常见方式。根据需求选择适合的方式来创建和显示弹出窗口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值