当前位置:  编程技术>移动开发
本页文章导读:
    ▪UINavigationBar设立背景图片        UINavigationBar设置背景图片 为UINavigatonBar增加如下Category: @implementation UINavigationBar (CustomImage) - (void)drawRect:(CGRect)rect { UIImage *image = [UIImage imageNamed: @"NavigationBar.png"]; [image drawInRect:CGRect.........
    ▪ CheckBox在ListView 而罗致其OnItemClickListener不会被触发        CheckBox在ListView 而导致其OnItemClickListener不会被触发 CheckBox在ListView 而导致其OnItemClickListener不会被触发     这个标题实在有点长  没办法而为之 本人语言实在乏善可陈   故开题之前 重新描.........
    ▪ 2.1干拐角的bug       2.1做拐角的bug 本来想在左下 左上弄一个拐角 <stroke android:width="3dp"          android:color="#555555"          />   <padding android:left="1dp"           android:top="1dp"           android:right=.........

[1]UINavigationBar设立背景图片
    来源: 互联网  发布时间: 2014-02-18
UINavigationBar设置背景图片
为UINavigatonBar增加如下Category:

@implementation UINavigationBar (CustomImage)  
- (void)drawRect:(CGRect)rect {  
    UIImage *image = [UIImage imageNamed: @"NavigationBar.png"];  
	[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];  
}  
@end 






改变UINavigatonBar的颜色
 UIColor *titleBarColor = [UIColor colorWithRed:153.0/255.0 green:70.0/255.0 blue:7.0/255.0 alpha:1.0];
    self.navigationController.navigationBar.tintColor=titleBarColor;

    
[2] CheckBox在ListView 而罗致其OnItemClickListener不会被触发
    来源: 互联网  发布时间: 2014-02-18
CheckBox在ListView 而导致其OnItemClickListener不会被触发

CheckBox在ListView 而导致其OnItemClickListener不会被触发

 

 

这个标题实在有点长  没办法而为之 本人语言实在乏善可陈   故开题之前 重新描述之

 

写道
ListView 中的各个item 通过 extends BaseAdapter 可以显示任意子View 当然也包括CheckBox

但是 当使用CheckBox 会导致ListView.setOnItemClickListener(OnItemClickListener listener) 中的listener不会被回调

 

 

通过Google 得到以下解释:

 

写道
ListView的item中加入CheckBox后 导致ListView对OnItemClick事件无法响应 原因是因为CheckBox的事件响应优先级高于List Item,所以屏蔽了ListItem的单击事件

 

 

而解决办法是:

 

写道
设置CheckBox的android:focusable="false"即可

 

 

 

但是 我设置以后 依然无效  只能再想别的办法   以下即为步骤:

 

 

 

[代码 步骤]

 

 

1. 鉴于今天重点以ListView 响应OnItemClickListener   故打算其显示item 数据以联系人数据为例

 

- 查询目标Uri

 

cursor = getContentResolver().query(People.CONTENT_URI, 
                null, null, null, null);

 

- 定义PeopleAdapter 用于接收数据源Cursor 

 

public class PeopleAdapter extends BaseAdapter {
    	Activity activity;
    	
    	public PeopleAdapter(Activity a){
    		activity = a;
    	}
    	
		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return cursor.getCount();
		}

		@Override
		public Object getItem(int arg0) {
			// TODO Auto-generated method stub
			return arg0;
		}

		@Override
		public long getItemId(int arg0) {
			// TODO Auto-generated method stub
			return arg0;
		}

		@Override
		public View getView(int arg0, View arg1, ViewGroup arg2) {
			// TODO Auto-generated method stub
			return CheckTest(arg0);
		}
		
		public View CheckTest(int position){
			cursor.moveToPosition(position);
			String name = cursor.getString(cursor.getColumnIndex("name"));
			
			CheckBox cb = new CheckBox(activity);
			cb.setText(name);
			cb.setFocusable(false);
			
			return cb;
		}

    }

 

 

 

 2.  emulator 运行截图

 

 

 

 

 

 

3.  通过ListView.setOnItemClickListener(...) 监听 onItemClick()  但是会失效

 

lv.setOnItemClickListener(new OnItemClickListener(){

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				// TODO Auto-generated method stub
				Log.d("TAG","onItemClick id:"+arg2);
			}
        	
        });

 

 

 

4.   下面就涉及 如何解决

 

写道
正式开始之前 说说其实现原理:

CheckBox 与 ListView.onItemClick() 冲突原因 前面说过 因为优先级问题

那么如果二者所占用的区域不同呢? 即:

CheckBox 的区域 就是 CheckBox 本身

而ListView.onItemClick() 监听 可以通过如下:


把CheckBox 放入LinearLayout , 如果单击区域是属于CheckBox 那显然就会执行CheckBox默认行为 即置CheckBox true/false , 如果单击区域处于CheckBox 外 但又属于LinearLayout 那么就视该动作 为ListView.onItemClick()

 

 

5.  定义2个int变量 作为CheckBox LinearLayout 的 id 索引起点

 

public final int LAYOUT_INDEX = 0;
public final int CHECKBOX_INDEX = 100;

 

 

 

6.  定义ListView 中 item 的布局 并设立CheckBox LinearLayout 的监听器

 

public View fromLayout(int position){
			cursor.moveToPosition(position);
			String name = cursor.getString(cursor.getColumnIndex("name"));

			final LinearLayout layout = new LinearLayout(activity);
	        layout.setOrientation(LinearLayout.HORIZONTAL);
	        layout.setId(position+LAYOUT_INDEX);
	        
			final CheckBox cb = new CheckBox(activity);
			cb.setText(name);
			cb.setBackgroundColor(Color.GRAY);
			
			cb.setId(CHECKBOX_INDEX+position);

			cb.setOnCheckedChangeListener(new OnCheckedChangeListener(){

				@Override
				public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
					// TODO Auto-generated method stub
					int id = cb.getId() - CHECKBOX_INDEX;
					boolean status = arg1;
					
					popMessage("CheckBox.onCheckedChanged",id);
				}
				
			});
			
			layout.addView(cb);
			
			layout.setOnClickListener(new OnClickListener(){

				@Override
				public void onClick(View arg0) {
					// TODO Auto-generated method stub
					id = arg0.getId() - LAYOUT_INDEX;
					
					popMessage("Layout.onClick",id);
				}
				
			});
			
			
			return layout;
		}

 

 

7.  在PeopleAdapter.getView(int arg0, View arg1, ViewGroup arg2) 使用 fromLayout()    其中 popMessage() 用于通知点击区域和id

 

public void popMessage(String prefix,int id){
    	String msg = "["+prefix+"].ID:"+id;
    	Toast.makeText(this,msg,Toast.LENGTH_LONG).show();
    }

  

 

8. emulator 运行截图  // 为了标记CheckBox显示区域 我用setBackgroundColor(Color.GRAY) 设定其颜色 便于观察

 

- 点击CheckBox

 

 

 

 

 

 

- 点击其他区域(非CheckBox)

 

 

 

 

 

 

鉴于语言所限 防止有人看不懂 故贴出研究代码 大家自己运行 应该就能理解之了  对了  别忘记顶贴哦!!!!!!

 

 

 

 

 

 

 

 

 

1 楼 rainsf 2010-06-23  
我来顶你.
2 楼 rainsf 2010-06-23  
不知有没有简单点的方法呢
3 楼 zcbbupt 2010-06-23  
好东西,学习啦!
4 楼 gryphone 2010-06-23  
rainsf 写道
不知有没有简单点的方法呢

目前为止 这是我发现的最简单的解决办法了
5 楼 sinfrancis 2010-06-23  
gryphone 写道
rainsf 写道
不知有没有简单点的方法呢

目前为止 这是我发现的最简单的解决办法了



设置CheckBox的android:focusable="false"是可以做到的,可能是你其他的View设置有问题,
我的很多代码都是使用此方法,不管是CursorAdapter还是ListAdapter,均没问题。
6 楼 gryphone 2010-06-24  
sinfrancis 写道
gryphone 写道
rainsf 写道
不知有没有简单点的方法呢

目前为止 这是我发现的最简单的解决办法了



设置CheckBox的android:focusable="false"是可以做到的,可能是你其他的View设置有问题,
我的很多代码都是使用此方法,不管是CursorAdapter还是ListAdapter,均没问题。

我也不知道为什么失败 我也设定了啊 

public View CheckTest(int position){   
33.            cursor.moveToPosition(position);   
34.            String name = cursor.getString(cursor.getColumnIndex("name"));   
35.               
36.            CheckBox cb = new CheckBox(activity);   
37.            cb.setText(name);   
38.            cb.setFocusable(false);   
39.               
40.            return cb;   
41.        }
7 楼 carywei 2010-06-29  
gryphone 写道
sinfrancis 写道
gryphone 写道
rainsf 写道
不知有没有简单点的方法呢

目前为止 这是我发现的最简单的解决办法了



设置CheckBox的android:focusable="false"是可以做到的,可能是你其他的View设置有问题,
我的很多代码都是使用此方法,不管是CursorAdapter还是ListAdapter,均没问题。

我也不知道为什么失败 我也设定了啊 

public View CheckTest(int position){   
33.            cursor.moveToPosition(position);   
34.            String name = cursor.getString(cursor.getColumnIndex("name"));   
35.               
36.            CheckBox cb = new CheckBox(activity);   
37.            cb.setText(name);   
38.            cb.setFocusable(false);   
39.               
40.            return cb;   
41.        }

==================================================================
你这样用,其实一个Item就是一个checkBox,当然设计无效了,你用Layout包含Checkbox的时候,checkbox就好用了。因为这时候checkbox不在占据一行了。
如果你使用xml文件配置这个item布局的话,通常放到某一个Layout里面,在xml文件设计android:focusable="false"是可以的。其实原理是一样的。(只是你理解有点问题,就是checkBox直接显示,就当作一行都是checkbox区域).
8 楼 zhuixinjian 2010-06-29  
一般这种列表中带checkbox的,我都载对象中定义一个字段。

boolean checked

onItemClick(int postiion){
   if(data.get(position).checked){
        data.get(position).checked= false;
   }else{
         data.get(position).checked = true;
     }

  adapter.notifyDateChange();

}


9 楼 xiaofanqingzjj 2010-09-08  
我只看了标题
没看内容
内容太长了
最简单的办法直接把checkbox的focusable 设为false就OK了  哪那么多废话
10 楼 lccly 2010-09-08  
我也是用的楼主这种方法,问题已经解决了~~
11 楼 lijunjie 2010-09-08  
恩。最关键的就是focusable=false.对我很有帮助
12 楼 herrylioi 2010-10-19  
可以使用CheckBoxPreference啊 使用SharedPreference的方式来保存信息
13 楼 violetluna 2010-11-04  
android:focusable="false" android:focusableInTouchMode="false"
android:clickable="true"

就可以了,这样既不会影响listview,也不会影响button
14 楼 greenboy1 2010-11-28  
好文章哦 呵呵 很不错
15 楼 wdsgyj 2010-12-08  
可不可以这样理解,楼主的方式相当于在滚动的过程中(不断地触发 getView 方法)不断地产生各种 listener 对象进行监听?
16 楼 Coding.Ghost 2010-12-12  
我也是将焦点属性设置为false.然后touch模式的焦点也设置为false.将checkBox的事件写在adapter里面.就不会有问题了.
17 楼 蓝月儿 2011-01-19  
顶一个 把控件放布局文件里了,还没重写OnItemClick事件,不过现在还没用到
18 楼 wxw404 2011-07-12  
也许这样可以,
给你需要的布局设置:
android:focusable="true"
android:focusableInTouchMode="true"

其他组件(不包括布局)
android:focusable="false"
android:focusableInTouchMode="false"
19 楼 柔情浪子 2011-09-27  
不错,顶起

    
[3] 2.1干拐角的bug
    来源: 互联网  发布时间: 2014-02-18
2.1做拐角的bug

本来想在左下 左上弄一个拐角

<stroke android:width="3dp" 
         android:color="#555555" 
         /> 
 
 <padding android:left="1dp" 
          android:top="1dp" 
          android:right="1dp" 
          android:bottom="1dp" 
          />  
 
 <corners android:radius="1dp" 
  android:bottomRightRadius="2dp" android:bottomLeftRadius="0dp"  
  android:topLeftRadius="2dp" android:topRightRadius="0dp"/>

 

要按照上面的来,如果按照下面的竟然没结果

<?xml version="1.0" encoding="UTF-8"?>  
<shape xmlns:android="http://schemas.android.com/apk/res/android">  
    <solid android:color="#555555"/>     
 
    <stroke android:width="3dp" 
            android:color="#555555" 
            /> 
 
    <padding android:left="1dp" 
             android:top="1dp" 
             android:right="1dp" 
             android:bottom="1dp" 
             />  
 
    <corners android:bottomRightRadius="0dp" android:bottomLeftRadius="2dp"  
     android:topLeftRadius="2dp" android:topRightRadius="0dp"/>  
</shape> 

别人说是2.1的bug

 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3