当前位置: 代码迷 >> Android >> Android开发的小疑点(转)
  详细解决方案

Android开发的小疑点(转)

热度:77   发布时间:2016-05-01 12:59:37.0
Android开发的小问题(转)

?? ?一些小问题,不大!但是足够让你花上一天或者一个礼拜的时间去解决!

原创文章:转载请注明作者:geolo。和文章出处:http://blog.csdn.net/geolo/article/details/7058515

?


?

1.Android中的ListView无法点击事件

?

?如果ListView子视图中有Button等抢焦点的控件,那么需要在ListViewxml配置中加入android:descendantFocusability="blocksDescendants"这段话,同时,对Button等控件需要android:focusable="false"的处理。


?

2.?软键盘,顶起自定义的底部菜单(RelativeLayout)

?

解决方法是Mainfest配置中对应的Activity加入android:windowSoftInputMode="stateVisible|adjustPan"信息


?

3.?不按Home键,让程序后台运行并退回Home界面!(通过Button模拟androidHome键盘)?

[html]?view plaincopyprint?
  1. PackageManager?pm?=?mActivity.getPackageManager();????
  2. ResolveInfo?homeInfo?=?pm.resolveActivity(new?Intent(Intent.ACTION_MAIN)??
  3. .addCategory(Intent.CATEGORY_HOME),?0);????
  4. ActivityInfo?ai?=?homeInfo.activityInfo;????
  5. Intent?startIntent?=?new?Intent(Intent.ACTION_MAIN);????
  6. startIntent.addCategory(Intent.CATEGORY_LAUNCHER);????
  7. startIntent.setComponent(new?ComponentName(ai.packageName,ai.name));??
  8. startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);????
  9. mActivity.startActivity(startIntent);??

?

?

?

?

4.ListView中不能使用Edittext的原因。

?

?

其一:?android:descendantFocusability="blocksDescendants",是该属性做的坏!该属性还会导致layout中的Edittext不能得到焦点。

其二:listview中如果用Edittext会导致Edittext内的内容在ListView自主刷新的时候,内容丢失。因此,如果数据量不是很多的情况下,可以采用Scroll+Layout方式

?

5.?ListView或者ScrollView,定位到你指定的自定义”layout的位置。

[html]?view plaincopyprint?
  1. final?int?x?=?v.getScrollX();//获取你自定义layout的X轴,貌似这边一直为0.你应该获取layout的getLeft的位置。哈哈??
  2. final?int?y?=?v.getTop();//获取你自定义layout的顶部的Y轴位置??
  3. ??
  4. mScrollView.post(new?Runnable()?{//是个线程刷新!??
  5. [email protected]
  6. ????public?void?run()?{??
  7. ????????mScrollView.scrollTo(x,?y);//开始定位??
  8. ????}??
  9. });??


?

6.?设置最小heap内存为6MB大小。

?

private?final?static?int?CWJ_HEAP_SIZE?=?6*?1024*?1024?;?

VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);

?

7.在自己的应用中监听其他APK安装完成事件?

?

<receiver?android:name=".XXReceiver">??

????<intent-filter>??

????????<action?android:name="android.intent.action.PACKAGE_ADDED"></action>??

????????<data?android:scheme="package"?/><!--?注意!!?这句必须要加,否则接收不到BroadCast?-->??

????</intent-filter>??

</receiver>?


String?android.content.Intent.ACTION_PACKAGE_ADDED?=?"android.intent.action.PACKAGE_ADDED"?

Broadcast?Action:?A?new?application?package?has?been?installed?on?the?device.?The?data?contains?the?name?of?the?package.?Note?that?the?newly?installed?package?does?not?receive?this?broadcast.?

My?include?the?following?extras:?

????*?EXTRA_UID?containing?the?integer?uid?assigned?to?the?new?package.?
????*?EXTRA_REPLACING?is?set?to?true?if?this?is?following?an?ACTION_PACKAGE_REMOVED?broadcast?for?the?same?package.?

This?is?a?protected?intent?that?can?only?be?sent?by?the?system?

----------?

当系统中新安装了一个软件或重新安装一个软件都会触发这个action的广播,?
并发送intent给接收者,发送的intent中包话新安装应用的包名、系统指定给这个应用的ID、标识是否这个广播是在ACTION_PACKAGE_REMOVED广播发送之后发送的。?

8.?Android监听程序的安装和卸载


android系统中,安装和卸载都会发送广播,当应用安装完成后系统会发android.intent.action.PACKAGE_ADDED广播。可以通过intent.getDataString()获得所安装的包名。当卸载程序时系统发android.intent.action.PACKAGE_REMOVED广播。同样intent.getDataString()获得所卸载的包名。
应用程序无法监听自己的安装与卸载,但覆盖安装可以监听到自己的android.intent.action.PACKAGE_REMOVED广播。

?

public?class?PackageReceiver?extends?BroadcastReceiver{

@Override

????public?void?onReceive(Context?context,?Intent?intent)?{????????

????????if?(intent.getAction().equals("android.intent.action.PACKAGE_ADDED"))?{

????????????String?packageName?=?intent.getDataString();

????????????Log.i("Test","---------------"?+?packageName);

????????}

?

????????if?(intent.getAction().equals("android.intent.action.PACKAGE_REMOVED"))?{

?????????String?packageName?=?intent.getDataString();

??????????Log.i("Test","---------------"?+?"PACKAGE_REMOVED"?+?packageName);

????????}

}

}

?

<?xml?version="1.0"?encoding="utf-8"?>

<manifest

???xmlns:android="http://schemas.android.com/apk/res/android"

????package="com.test"

????android:versionCode="1"

????android:versionName="1.0">

????<application

?????android:icon="@drawable/icon"

?????android:label="测试">

????????<receiver?android:name=".PackageReceiver"

??????????????????android:label="@string/app_name">

????????????<intent-filter>

??????????????<action?android:name="android.intent.action.PACKAGE_ADDED"?/>

??????????????<action?android:name="android.intent.action.PACKAGE_REMOVED"?/>

???????????????<data?android:scheme="package"?/>

????????????</intent-filter>

????????</receiver>

????</application>

????<uses-sdk?android:minSdkVersion="7"?/>

???<uses-permission?android:name="android.permission.INTERNET"?/>

????<uses-permission?android:name="android.permission.RESTART_PACKAGES"/>

????<uses-permission?android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

</manifest>




?????????9.背景图片平铺



1.?res/drawable的文件夹中新建一个bg_repeat.xml文件。

?

2.?文件代码为:

<?xml?version?="1.0"?encoding?="utf-8"??>

?

<bitmap?xmlns:android?="http://schemas.android.com/apk/res/android"

?

???android:src?="@drawable/bg"

?

???android:tileMode?="repeat"?/>

3.?其中bg就是单个图片文件。

4.?调用的时候,调用这个bg_repeat.xml?--->android:background="@drawable/bg_repeat"


?

?

?10.?Android?view中的requestLayoutinvalidate方法


?requestLayout:当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent?view重新调用他的onMeasure?onLayout来对重新设置自己位置。

特别的,
当一个View需要parent?view重新调用他的onMeasure?onLayout来对重新设置自己位置时,特别是当你修改了viewlayoutparameter,它的值还没能应用到view上,调用这个方法就可以了,但是要注意parent?viewonLayout是怎么实现的

?

?

11. 关于SpannableString在内存容量小的手机上出现的内存、堆栈溢出的问题!


[html]?view plaincopyprint?
  1. ???????SpannableString?mSpannableString?=?new?SpannableString("abcdefg/斗眼");//崩溃??
  2. SpannableString?mSpannableString?=?new?SpannableString("abcdefg斗眼");//崩溃??
  3. SpannableString?mSpannableString?=?new?SpannableString("abcdefg//");//不崩溃??
  4. SpannableString?mSpannableString?=?new?SpannableString("abcdefg/");//不崩溃??
  5. SpannableString?mSpannableString?=?new?SpannableString("abcdefg");//不崩溃??

可以总结出,SpannableString新建汉字的时候需要比较大的内存容量,这个问题,需要深究思考!
  相关解决方案