View Tag相关

View的tag方法可以让View附带很多信息,方便使用。最常用的一个例子:在Adapter中我们经常用到View的setTag()和getTag()方法,从而使用ViewHolder来提高效率。 问题1:当我们需要添加多个tag时该怎么做呢? View还有一个setTag(int key, final Object tag)方法,想添加多少tag都行。 问题2:直接调用方法View.setTag(1,"msg"),出现异常: java.lang.IllegalArgumentException: The key must be an application-specific resource id. 异常信息的意思是说:key必须是特定的资源id。 最直接的方法就是在资源文件中添加一条记录: <item type="id" name="tag_first"></item> 可以添加到res/values/strings.xml或者res/values/ids.xml中,然后调用View.setTag(R.id.tag_first,"msg")即可。 知道解决方法了,再来找一下原因。以下是View中相关源码: ...

七月 3, 2013

LayoutInflater丢失View的LayoutParams

View view = inflater.inflate(R.layout.item, null); 在使用类似以上方法获取view时会遇到的一个问题就是布局文件中定义的LayoutParams被忽略了。以下三个stackoverflow问题就是这样: http://stackoverflow.com/questions/5288435/layout-params-of-loaded-view-are-ignored http://stackoverflow.com/questions/5026926/making-sense-of-layoutinflater http://stackoverflow.com/questions/2738670/layoutinflater-ignoring-parameters 都说这样使用就可以了: View view = inflater.inflate( R.layout.item /* resource id */, parent /* parent */,false /*attachToRoot*/); 至此问题已经解决了,但是三个问题都没有提到为什么要这样调用才行。 感兴趣的我们到源码里来找答案,LayoutInflater的inflate方法,最后都是调用的同一个方法: public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot) 原因自然在这个方法里,大概意思就是只有ViewGroup root不为空才会读取View的LayoutParams。attachToRoot = true的时候,会把View添加到root中。而大多情况不希望被addView到root中,自然要赋值为flase,这样就是上面的解决方案了。 可以参看LayoutInflater的inflate方法相关的源码: ...

五月 6, 2013

This Handler class should be static or leaks might occur

更新到adt20的开发者们可能会在handler上发现这么一条警告: This Handler class should be static or leaks might occur 首先在ADT 20 Changes中我们可以找到这样一个变化New Lint Checks: Look for handler leaks: This check makes sure that a handler inner class does not hold an implicit reference to its outer class. 翻译过来就是,Lint会增加一个检查项目:确保class内部的handler不含有外部类的隐式引用 。 同一个线程下的handler共享一个looper对象,消息中保留了对handler的引用,只要有消息在队列中,那么handler便无法被回收, 如果handler不是static那么使用Handler的Service和Activity就也无法被回收。这就可能导致内存泄露。当然这通常不会发 生,除非你发送了一个延时很长的消息。 知道了原因我们在来看解决方法: 1.最不想动代码的同学,可以在Preference搜一下Lint,在Lint Error Checking里搜HandlerLeak,然后选择ignore,然后整个世界清净了。。。。(不推荐) 2.上面的方法虽然简单,但是肯定不好的。。。给这个检查肯定是有用的,那第二种方法,自然就是把Handler定义成static,然后用post方法把Runnable对象传送到主线程: private static Handler handler; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Create a handler to update the UI handler = new Handler(); } void test() { handler....

九月 15, 2012

Override错误--Multiple markers at this line

错误信息如下: Multiple markers at this line - The method getCards() of type ServiceImpl must override a superclass method - implements com.service.IService.getCards 如果按一下“-”中的方法处理还不行的话,就要修改项目对应的compiler compliance level : 右键项目-属性-Java Compiler-查看是不是工程指定的是不是JavaSE-1.6,如果不是去掉use compliance前面的对勾,自己选择成1.6确定即可 以下来自:http://www.189works.com/portal.php?mod=view&aid=46816 一、java @override 报错处理 有时候在自己电脑上编译通过的java代码,在别人那里却编译不通过,总是@override报错,把@override去掉就好了,但不能从根本上解决问题。 据说这是jdk的问题,@Override是JDK5就已经有了,但有个小小的Bug,就是不支持对接口的实现,认为这不是Override 而JDK6修正了这个Bug,无论是对父类的方法覆盖还是对接口的实现都可以加上@Override。 首先要确保安装了jdk 1.6,然后,在eclipse中修改配置,在 Windows->Preferences–>java->Compiler–>compiler compliance level 中选择 1.6,刷新工程,重新编译下; 如果还是不行,就在报错的工程上,鼠标右键选择 Properties–>Java Compiler–>compiler compliance level 中选择 1.6,刷新工程,重新编译下。 二、Android之@Override详解 Android的开发者对@Override肯定是非常熟悉,不管是自己的代码中还是书上都会出现,但是他是什么意思呢?如下: @Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: 可以当注释用,方便阅读 编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错比如你如果没写@Override而你下面的方法名又写错了,这时你的编译器是可以通过的(它以为这个方法是你的子类中自己增加的方法) 例如:在重写父类的onCreate时,在方法前面加上@Override系统可以帮你检查方法的正确性。 public void onCreate(BundlesavedInstanceState){…….} 这种写法是正确的,如果你写成 public void oncreate(BundlesavedInstanceState){…….} 这样编译器会报如下错误: The method oncreate(Bundle)of type HelloWorld must override or implement a super type method,...

五月 29, 2012

Android系统图库中扫描不到任何图片

由于系统自带的存储空间(SD卡内文件也有可能吧)内出现文件损坏,文件系统出现问题导致(无法删除)。图库在扫描时出现异常,所以扫描不到任何图片。 修复方法: USB连接电脑–手机选择打开USB存储设备–Window下打开cmd窗口—输出 chkdsk I: /F 回车即可修复完成。 其中:I 是你的存储空间对应的盘符。

四月 16, 2012

[Android排错]Circular dependencies cannot exist in RelativeLayout

03-30 14:19:26.690: E/AndroidRuntime(8437): java.lang.IllegalStateException: Circular dependencies cannot exist in RelativeLayout 在相对布局中不能存在循环依赖! 比如先A在B的下边,就不能定义B在A上下左右。。。 而源码中也提到了另外一种循环依赖: RelativeLayout layout_height设置为wrap_content,然后设置子viewlayout_alignParentBottom=“true”。 RelativeLayout高依赖于子View,而子View又声称在RelativeLayout的底部。 /** * * Note that you cannot have a circular dependency between the size of the RelativeLayout and the * position of its children. For example, you cannot have a RelativeLayout whose height is set to * {@link android.view.ViewGroup.LayoutParams# WRAP_CONTENT WRAP_CONTENT} and a child set to * {@link# ALIGN_PARENT_BOTTOM}. * */ 但是这种情况不会出现异常,实际上相当于设置fill_parent的效果。

三月 31, 2012