@wangwangheng
2015-03-28T06:48:16.000000Z
字数 5308
阅读 2526
问题解决
目录:
layout_height="wrap_content"
属性不起作用?问题描述:定义一个添加View后自动换行的ViewGroup,但是自定义的ViewGroup 的layout_height
不管是怎么设置都是全满全屏的。我想要使之能够实现layout_height="wrap_content"
时能够根据内容自适应高度,应该要怎么做?问题参考链接
解决:参考LinearLayout的onMeasure方法就可以了。在LinearLayout里面会判断是否为wrap_content,如果是则测量并累加子控件的高度,最后作为参数传入setMeasureDimension方法中。
关于怎样判断是不是wrap_content,可以这么判断
问题: 当在工程中引用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
如果发生此种错误,首先验证下是不是硬件加速导致的,有以下两种方式:
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
android:layerType="software"
TextView..getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
Paint.STRIKE_THRU_TEXT_FLAG:这个标记实际上是加上中划线
Paint.ANTI_ALIAS_FLAG:抗锯齿属性,加这个标记是为了防止在某些分辨率较低的手机上因为锯齿中划线显示不出来
如果在ListView的Item中出现EditText,而且要得到它的内容,不要在TextWatcher监听中添加得到内容的代码,而应该在OnFocusChange的监听中添加
只要是在重用convertView的ListView中,注意在getView中设置View的真实的状态,因为View的重用导致View状态错乱(需要去学习ListView或者AdapterView的原理,来了解View的回收和重用)
通过使用 startActivityForResult() 和 onActivityResult() 方法可以在Activity之间传递或接收参数。但有时候我们会遭遇onActivityResult()不执行的情况,
第一种情况就是在执行startActivityForResult的时候紧跟着onActivityResult()方法也被执行,我们打log就会发现在onActivityResult()方法中resultCode参数一直返回0,出现这种情况就是跟我们的Activity加载模式有关的,即在AndroidManifest.xml中设置activity的时候添加了android:launchMode这个属性,在android SDK中有说明Activity被设置为单例模式时onActivityResult()这个无效,也就是android:launchMode="singleTask"和android:launchMode="singleInstance"都会导致无效
第二种情况是startActivityForResult(intent,0);这个方法中第二个参数,当我们设置这个参数小于0时就会发现onActivityResult()方法就没有响应的android SDK中有提到这个参数必须是大于或者等于0的
第三种情况在TabHost的子Activity中startActivityForResult调用其他Activity时候遭遇到onActivityResult方法不响应的问题.直接看下面的链接
在TabHost的子Activity中startActivityForResult调用其他Activity时候遭遇到onActivityResult方法不响应的问题.
解决办法如下:
1.通过父Activity启动其他Activity;
2.实现父Activity的onActivityResult方法,将该处接收到的请求转发给当前活动的子Activity;
3.自定义一个转发接口用来实现第2步中的转发功能;
4.子Activity中实现第3步接口中的方法用来接收返回信息;
代码如下:
1.通过父Activity启动其他Activity
getParent().startActivityForResult(new Intent(...), REQUEST_CODE);
2.实现父Activity的onActivityResult方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 获取当前活动的Activity实例
Activity subActivity = getLocalActivityManager().getCurrentActivity();
//判断是否实现返回值接口
if (subActivity instanceof OnTabActivityResultListener) {
//获取返回值接口实例
OnTabActivityResultListener listener = (OnTabActivityResultListener) subActivity;
//转发请求到子Activity
listener.onTabActivityResult(requestCode, resultCode, data);
}
super.onActivityResult(requestCode, resultCode, data);
}
3.自定义接口
/**
* 解决子Activity无法接收Activity回调的问题
* @author Administrator
*
*/
public interface OnTabActivityResultListener {
public void onTabActivityResult(int requestCode, int resultCode, Intent data);
}
4.子Activity需要实现onTabActivityResult方法
@Override
public void onTabActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
//实现该处逻辑
...
}
}
问题发生概述:
程序编译正常,在用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包中的类,所以工程中的这个类就是重复引用的,删除工程中重复引用的类后,成功打包启动。希望各位同学注意这个小问题。
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);