[关闭]
@wangwangheng 2015-03-28T06:48:16.000000Z 字数 5308 阅读 2344

问题解决笔记1

问题解决


目录:

1. ViewGroup的layout_height="wrap_content"属性不起作用?

问题描述:定义一个添加View后自动换行的ViewGroup,但是自定义的ViewGroup 的layout_height不管是怎么设置都是全满全屏的。我想要使之能够实现layout_height="wrap_content"时能够根据内容自适应高度,应该要怎么做?问题参考链接

解决:参考LinearLayout的onMeasure方法就可以了。在LinearLayout里面会判断是否为wrap_content,如果是则测量并累加子控件的高度,最后作为参数传入setMeasureDimension方法中。

关于怎样判断是不是wrap_content,可以这么判断


2. Android自定义View的时候res-auto与res/packageName的区别

问题: 当在工程中引用library工程中的自定义控件的时候,编译错误,提示No resource identifier found forattribute 'customValue' in package 'com.mycompany.test.lib'或者Issue 9656: Library projects don't support custom XML attributes for custom classes

解决方案: Upgrade to latest SDK & ADT version (fixed was released since r17) and use http://schemas.android.com/apk/res-auto as custom attributes' namespace URI, see Revisions for ADT 17.0.0:

Added support for custom views with custom attributes in libraries. Layouts using custom attributes must use the namespace URI http://schemas.android.com/apk/res-auto instead of the URI that includes the app package name. This URI is replaced with the app specific one at build time.

res与res-auto的区别

通常我们在布局文件中使用自定义属性的时候会这样写:xmlns:app="http://schemas.android.com/apk/res/包路径"

但如果你当前工程是做为lib使用,那么你如上所写 ,会出现找不到自定义属性的错误 。
这时候你就必须写成:xmlns:app="http://schemas.android.com/apk/res-auto

参考res与res-auto的区别


3. 当WebView快速创建、从其他界面快速切换的时候白屏

如果发生此种错误,首先验证下是不是硬件加速导致的,有以下两种方式:

4. 文本的删除线(中划线)

TextView..getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
Paint.STRIKE_THRU_TEXT_FLAG:这个标记实际上是加上中划线
Paint.ANTI_ALIAS_FLAG:抗锯齿属性,加这个标记是为了防止在某些分辨率较低的手机上因为锯齿中划线显示不出来

5. ListView item中的EditText

如果在ListView的Item中出现EditText,而且要得到它的内容,不要在TextWatcher监听中添加得到内容的代码,而应该在OnFocusChange的监听中添加

只要是在重用convertView的ListView中,注意在getView中设置View的真实的状态,因为View的重用导致View状态错乱(需要去学习ListView或者AdapterView的原理,来了解View的回收和重用)

6. Activity使用startActivityForResult时出现onActivityResult()不执行的问题

通过使用 startActivityForResult() 和 onActivityResult() 方法可以在Activity之间传递或接收参数。但有时候我们会遭遇onActivityResult()不执行的情况,

7. TabHost中使用startActivityForResult无法接收返回值的解决方案

在TabHost的子Activity中startActivityForResult调用其他Activity时候遭遇到onActivityResult方法不响应的问题.

解决办法如下:
1.通过父Activity启动其他Activity;
2.实现父Activity的onActivityResult方法,将该处接收到的请求转发给当前活动的子Activity;
3.自定义一个转发接口用来实现第2步中的转发功能;
4.子Activity中实现第3步接口中的方法用来接收返回信息;

代码如下:

1.通过父Activity启动其他Activity

  1. getParent().startActivityForResult(new Intent(...), REQUEST_CODE);

2.实现父Activity的onActivityResult方法

  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3. // 获取当前活动的Activity实例
  4. Activity subActivity = getLocalActivityManager().getCurrentActivity();
  5. //判断是否实现返回值接口
  6. if (subActivity instanceof OnTabActivityResultListener) {
  7. //获取返回值接口实例
  8. OnTabActivityResultListener listener = (OnTabActivityResultListener) subActivity;
  9. //转发请求到子Activity
  10. listener.onTabActivityResult(requestCode, resultCode, data);
  11. }
  12. super.onActivityResult(requestCode, resultCode, data);
  13. }

3.自定义接口

  1. /**
  2. * 解决子Activity无法接收Activity回调的问题
  3. * @author Administrator
  4. *
  5. */
  6. public interface OnTabActivityResultListener {
  7. public void onTabActivityResult(int requestCode, int resultCode, Intent data);
  8. }

4.子Activity需要实现onTabActivityResult方法

  1. @Override
  2. public void onTabActivityResult(int requestCode, int resultCode, Intent data) {
  3. if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
  4. //实现该处逻辑
  5.         ...
  6. }
  7. }

8. Eclipse运行Android程序

问题发生概述:
程序编译正常,在用Eclipse调试执行时,报错Unable to execute dex: Multiple dex files define,因为以前也没有遇到这类错误,首先便尝试万能纠错发,如下方法一,也是上网搜索众多解决方案之一,尝试后未果,便按照搜索方案,逐一尝试,都未能解决,最后盯着工程突然发现问题。具体解决方案如下:
方法一:
Eclipse->Project->去掉Build Automatically->Clear ->Build Project->Build Automatically,关闭Eclipse,再打开(我的问题不是出在这)

方法二:
更新ADT插件,删除workspace目录下的.metadata目录,(这个解决方案没有尝试,因为在开发过程中,我只是更换了一个jar包而出现的错误,而且开发环境不能连网络,不方便尝试)

方法三:
在你的项目下某个文件夹中有一个后缀为*.APK的文件,删掉,重启Eclipse即可。(尝试未果)

方法四:
原因是有重复的。jar被引用,可以查看你的build path,尤其是Android Dependencies一定有重复引入的.jar包,解决的方法是在libs删除重复的jar即可。 (我找了半天,也没有发现重复引用的jar包,不过还是得感谢这位同学,我最终能解决问题也是受到这个方案的启发,贴上博客连接http://blog.sina.com.cn/s/blog_4b9b6ad001016uuk.html)(我的是这种)

方法五:(成功解决方法)
在项目中,有一个类的包名和引用的jar包中的类和包名一致,我用的是jar包中的类,所以工程中的这个类就是重复引用的,删除工程中重复引用的类后,成功打包启动。希望各位同学注意这个小问题。

9. 禁用Manifest中注册的BroadcastReceiver

sendBroadcast(new Intent("com.culiu.purchase.MyReceiver"));
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
ComponentName component = new ComponentName(getContext(),"com.test.my.MyReceiver");
final PackageManager pm = getContext().getPackageManager();
pm.setComponentEnabledSetting(component,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);

    sendBroadcast(new Intent("com.culiu.purchase.MyReceiver"));
}

}, 2000);

http://blog.chinaunix.net/uid-20548090-id-3167107.html

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注