弹出列表对话框,选择列表项后返回结果并消失

最近的开发过程中,有选择时间段的需求,需要弹出一个列表对话框,用户选择完列表项之后返回用户选择结果,当前列表项消失。

 

首先,在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该弹出的对话框。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值