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 plain copy print ?
  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 plain copy print ?
  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.     @Override  
  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 来对重新设置自己位置时,特别是当你修改了 view layoutparameter ,它的值还没能应用到 view 上,调用这个方法就可以了,但是要注意 parent view onLayout 是怎么实现的

 

 

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


[html]  view plain copy print ?
  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新建汉字的时候需要比较大的内存容量,这个问题,需要深究思考!

猜你喜欢

转载自ggdsn.iteye.com/blog/1709501