最近的开发过程中,有选择时间段的需求,需要弹出一个列表对话框,用户选择完列表项之后返回用户选择结果,当前列表项消失。
首先,在res/layout文件夹定义一个列表项对应的布局文件以便加载:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="wrap_content" android:entries="@array/time_zone" android:divider="#cccccc" android:dividerHeight="1px" /> </LinearLayout>
单击按钮,弹出该布局:
Button time = (Button) findViewById(R.id.time); time.setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { // LayoutInflater inflater = LayoutInflater.from(this); LinearLayout ll = (LinearLayout) getLayoutInflater().inflate(R.layout.time, null); final ListView lv = (ListView) ll.findViewById(R.id.list); AlertDialog.Builder builder = new AlertDialog.Builder(TabActivity_book.this) // .setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() { // // @Override // public void onClick(DialogInterface dialog, int which) { // ((Button)v).setText(items[which]); // // } // }); .setView(ll); dialog = builder.create(); dialog.show(); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { time.setText(lv.getItemAtPosition(position).toString()); // ll.removeView(lv); dialog.dismiss(); } }); } });
注:如果把
LinearLayout ll = (LinearLayout) getLayoutInflater().inflate(R.layout.time, null); final ListView lv = (ListView) ll.findViewById(R.id.list);
这2段代码放在监听器方法的外面,则在单击按钮选择时间后再次单击,会报异常:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
原因是ListView既属于LinearLayout,而LinearLayout又是由Dialog弹出的——如果把加载页面和相应的列表项放在外面时,在第一次弹出列表框时,已经kill掉了dialog,这就间接kill掉了属于他的LinearLayout。当用户再次单击按钮试图再次加载该布局文件时,LinearLayout已经在上一次(第一次)被kill掉了(因为他是放在外面的)。所以报错!
解决办法则是把这2行代码放在监听器方法里面,每单击一次就重新创建一次Linearlayout,即加载布局文件,在用户选择列表项后,dismiss该弹出的对话框。
相关推荐
结合ListView和PopupWindow,我们可以创建一个类似微信下拉菜单的交互体验,用户在某个操作后(如点击按钮)弹出包含多个选项的PopupWindow,每个选项对应ListView的一个列表项。通过这种方式,开发者可以为用户提供...
- 在弹出的对话框中,选择“命令”标签页。 - 从左侧的“类别”列表中选择“宏”。 - 从右侧的“命令”列表中选择刚才创建的宏。 - 拖拽该宏到工具栏的适当位置。 #### 四、常见问题及解决方法 - **工具栏无法...
1.15 离开页面时弹出对话框 1.16 判断页面是否添加了W3C声明 1.17 屏蔽网页中的脚本 1.18 以频道模式打开页面 1.19 自动识别网页类型 1.20 在网页中动态添加Script脚本 1.21 用JavaScript随机修改页面的标题 1.22 ...
1.15 离开页面时弹出对话框 1.16 判断页面是否添加了W3C声明 1.17 屏蔽网页中的脚本 1.18 以频道模式打开页面 1.19 自动识别网页类型 1.20 在网页中动态添加Script脚本 1.21 用JavaScript随机修改页面的标题 1.22 ...
本项目中,我们创建了一个自定义的Dialog,并利用ListView作为弹出窗口的主要展示组件,实现了灵活多样的选择功能,并且具备记住用户上次选择项的能力。通过枚举类型填充数据,确保了代码的清晰性和可维护性。 首先...
通过模拟长按特定文本的操作,可以测试长按事件的处理逻辑,比如弹出上下文菜单或触发其他特定动作。 #### 9. 使用正则表达式 `solo.clickOnText("(?i).*?Delete.*")` 点击文本 此方法允许使用正则表达式来匹配并...
建立好后工程文件列表如下图。 2.新建对话框类,如下图,在新建中,选择Qt Designer Form Class。 3.选择Dialog without Buttons。 4.类名设为myDlg。 5.点击Finish 完成。注意这里已经默认将其加入到了我们刚建的...
在描述中提到的"通过弹出框形式展示",可能是指当用户点击某个文件或目录时,一个包含更多选项的对话框会弹出,例如打开、重命名、分享等操作。 在文件管理软件的设计中,有两种主要的用户交互方式: 1. **弹出框...
单击“窗口”按钮,在弹出对话框中设置窗口名称和窗口属性。如图3-3。 以下的按钮分别是“位图(Bitmaps…)”、“映射(Maps…)”、“别名(Alias…)”、“设置(Config…)”、“数据文件(Data Files…)”...
- 在服务列表中,查找名为“SmartCard”或“智能卡”的服务项。 - 如果找到了该服务,请直接进入下一步。 - 如果没有找到,或者在尝试启动服务时遇到了问题,则需要按照以下步骤重新安装SmartCard服务。 3. **...
修改扩展界面支持库三,解决单击卷帘菜单后导致日期框不能弹出下拉窗口的BUG。 4. 修改XP风格支持库,解决GDI资源泄露,以及在使用通用组件库六时组合框标题出现重影的BUG。 5. 修改扩展界面支持库一,解决树形框...
- 点击“显示”按钮,在弹出的窗口中可以看到一系列可被隐藏的“控制面板”项目列表。 4. **选择要隐藏的项目**: - 在“显示”窗口中,可以查看所有可以被隐藏的“控制面板”项目列表。 - 选择您希望隐藏的项目...
(7)通过对话框的弹出可提示玩家是否查看游戏说明、是否进入下一关、是否重新开始等消息,使得玩家可自己选择。 2. 相关技术 2.1 Windows定时器技术 Windows定时器是一种输入设备,它周期性地在每经过一个指定...
- 在弹出的对话框中选择“Microsoft Word”作为编辑器。 - 编辑完成后保存并关闭Word文档。 ### 12. AutoCAD图导入Photoshop的方法。 将AutoCAD图形导入Photoshop中,可以使用以下步骤: - 在AutoCAD中将图形导出为...
- 弹出层中的弹出层关闭,父窗口失去焦点问题。 - 代码中grunt部分代码拆分开,放到程序外面;提交到git、osc - 桌面:删除alert enter快捷键删除 - install 检测 加入跳过,(只判断用到的函数) 加入多语言 - ...
4. **使用导航控制器(UINavigationController)**:对于需要堆栈管理的视图切换,如在列表项被点击时跳转到详情页,通常会使用Navigation Controller。通过Navigation Controller,可以方便地实现“返回”功能,只...
-Grid增加GetNoSelectionAlertInParentReference函数,用来表示没有选中任何一项时在父页面弹出对话框的JS代码。 -修正IE7下不能以下划线作为CSS中类名的前缀的BUG(feedback:Steve.Wei)。 -添加定时器控件Timer,...
-Grid增加GetNoSelectionAlertInParentReference函数,用来表示没有选中任何一项时在父页面弹出对话框的JS代码。 -修正IE7下不能以下划线作为CSS中类名的前缀的BUG(feedback:Steve.Wei)。 -添加定时器控件Timer,...
13. **界面美观性**:所有弹出窗口应居中显示或最大化,过长的字段应用省略号或换行显示。 14. **默认值设定**:人员和时间的缺省值通常为当前登录人员和时间。 15. **字段单位标注**:带有单位的字段应明确标注单位...