Android开发的小问题

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


原创文章:转载请注明作者:geolo。和文章出处:http://itmanito.com/geolo/?p=38


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

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

    如果,子视图item是继承LinearLayout类,用inflate来嵌套的,那么里面的button等设置了监听是不能被分发出去的。做法是每个子item有个baseClass,这个baseClass有个让getVeiw()调用的registerWidgetListening()方法,registerWidgetListening()方法是自定义的咯。  意思就是,要让这种子item的button设置的监听能够分发到,那么需要想办法,让子item里的button在getview的时候去设置监听。


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

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

  --> 注意:如果UI设置了全屏效果,以上配置失效。


3. 设置软键盘showSoftInput()方法,不能弹出软键盘的问题。 

因为有些组件会去抢EditText组件的焦点,你虽然点触了EditText但是很快又失去焦点,就不能弹出软键盘了。  也可以知道一个事实:  软键盘的弹出与否取决于EditText是否有焦点。
                        editText.setFocusable(true);  
			editText.setFocusableInTouchMode(true);  
			editText.requestFocus();  

让你的EditText有焦点吧!!!!


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

                PackageManager pm = mActivity.getPackageManager();  
                ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN)
                .addCategory(Intent.CATEGORY_HOME), 0);  
                ActivityInfo ai = homeInfo.activityInfo;  
                Intent startIntent = new Intent(Intent.ACTION_MAIN);  
                startIntent.addCategory(Intent.CATEGORY_LAUNCHER);  
                startIntent.setComponent(new ComponentName(ai.packageName,ai.name));
                startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
                mActivity.startActivity(startIntent);


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

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

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


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

                    final int x = v.getScrollX();//获取你自定义layout的X轴,貌似这边一直为0.你应该获取layout的getLeft的位置。哈哈
                    final int y = v.getTop();//获取你自定义layout的顶部的Y轴位置

                    mScrollView.post(new Runnable() {//是个线程刷新!
                        @Override
                        public void run() {
                            mScrollView.scrollTo(x, y);//开始定位
                        }
                    });


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

    private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ; 
    VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);

8.在自己的应用中监听其他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广播发送之后发送的。 

9. 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>

10.背景图片平铺

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"

 11. Android view中的requestLayoutinvalidate方法

    requestLayout :当 view 确定自身已经不再适合现有的区域时,该 view 本身调用这个方法要求parent view 重新调用他的 onMeasure onLayout 来对重新设置自己位置。
 特别的 ,当一个 View 需要 parent view 重新调用他的 onMeasure onLayout 来对重新设置自己位置时,特别是当你修改了 view layoutparameter ,它的值还没能应用到 view 上,调用这个方法就可以了,但是要注意 parent view onLayout 是怎么实现的

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

              SpannableString mSpannableString = new SpannableString("abcdefg/斗眼");//崩溃
	      SpannableString mSpannableString = new SpannableString("abcdefg斗眼");//崩溃
	      SpannableString mSpannableString = new SpannableString("abcdefg//");//不崩溃
	      SpannableString mSpannableString = new SpannableString("abcdefg/");//不崩溃
	      SpannableString mSpannableString = new SpannableString("abcdefg");//不崩溃

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


13.PoPWindow无法自动设置高度宽度的问题!

 每次设置布局以后,还需要强制设置高度和宽度!

                        //mRecordPopWindow.setContentView(recordingView);			
			//mRecordPopWindow.setWidth(50);
			//mRecordPopWindow.setHeight(50);
如果有背景图,可以用
mRecordPopWindow.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.szrs_pls_talk));

14.关于zygote总结:

zygote是在Android系统中创建Java世界的盘古,它创建了第一个Java虚拟机,同时它又是女娲,成功地繁殖了framework的核心systemserver进程,回顾一下zygote创建Java世界的步骤:
第一天:创建AppRuntime对象,并调用它的start。此后的活动则由AppRuntime来控制。
第二天:调用startVm创建Java虚拟机,然后调用startReg来注册JNI函数。
第三天:通过JNI调用com.android.internal.os.ZygoteInit类的函数,从此进入了Java世界。而在这个世界开创的时候,什么东西都没有。
第四天: 调用registerZygoteSocket函数,通过这个函数创建了socket,使之能响应子孙后代的请求。同时zygote调用preloadClass和preloadResources,为Java世界添砖加瓦。
第五天:zygote觉得自己的工作压力太大,便通过调用startSystemServer分裂了一个进程——systemserver来为java世界服务。
第六天:zygote完成了Java世界的初创工作,它已经很满足了。下一步该做的就是调用runSelectLoopMode后,便睡眠了。
以后的日子,zygote随时守护在我们的周围,当接收到子孙后代的请求时,它会随时醒来,为它们工作。所以zygote可以称之为Android世界的“盘古_女娲”。 

15. 关于SSL的搭建:

android/ios上只要在socket上根据SSL的协议规划,而服务端要特殊配置下证书就可以。

16. Android TextView 展开全文,收缩简文的方式:

转:http://www.chengxuyuans.com/Android/55033.html
有人可能要说,万一我想初始几行呢?放心,一样可以。上代码:
在xml文件中设置了如下属性:
android:lines="4"      //我初始化的4行  
Activity那边代码一样,只改一点
 if(flag){
        flag = false;
         tv.setEllipsize(null); // 展开
         tv.setSingleLine(flag);
        }else{
          flag = true;
          tv.setEllipsize(TextUtils.TruncateAt.END); // 收缩
    }

 设置setSingleLine的目的是为了取消lines==“4”这个固定值。

17. 动态设置全屏和隐藏状态栏

//设置全屏  
			WindowManager.LayoutParams attrs = getWindow().getAttributes();     
			attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;     
			getWindow().setAttributes(attrs);     
			getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);  
			//修改window的LayoutParams参数,然后加上FLAG_LAYOUT_NO_LIMITS标志,就OK了。window会自动重新布局,呈现全屏的状态。
//显示状态栏,取消全屏
final WindowManager.LayoutParams attrs = getWindow().getAttributes();
				attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
				getWindow().setAttributes(attrs);
				getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);


17. WebView隐藏滑动条/滚动条


m_webView.setHorizontalScrollBarEnabled(false);
m_webView.setHorizontalScrollbarOverlay(false);
m_webView.setVerticalScrollBarEnabled(false);
m_webView.setVerticalScrollbarOverlay(false);
m_webView.setScrollbarFadingEnabled(false);
m_webView.getSettings().setBuiltInZoomControls(false);

18. 恶心的IOS开发之sem信号量

发现 iOS不支持匿名的信号量, Android不支持命名信号量 创建的时候要不一样 #ifdef IOS
m_sem =  sem_open(semaphore_name, O_CREAT, 0644, start_val);
#else
sem_init(&m_sem, 0, start_val);
#endif


19. android5.0 + , 导致 canvas.drawRect 的error错误和奔溃

    canvas.drawRect 狗日的。调用频率过快,导致drawText奔溃。。。
    谁能告诉我,为什么?百度,google都找不到原因!
    android5.0,非debug模式下。即release模式下。
    (debug模式下,内存占用等系统资源比release多)


20. ArgbEvaluator

    !!重点这个方法简直不要太吊。。
  ArgbEvaluator.evaluate(float fraction, Object startValue, Object endValue);
  根据一个起始颜色值和一个结束颜色值以及一个偏移量生成一个新的颜色,分分钟实现类似于微信底部栏滑动颜色渐变。


21. ndk 'GL_RED_EXT' was not declared in this scope

       在Application.mk文件中加    APP_PLATFORM := android-21 , 或者更高!别问为什么,明显是版本问题。或者你的minapi设置21~


22. Function 'UINT64_C' could not be resolved

出现错误:jni/ffmpeg/libavutil/common.h:175:47: error: 'UINT64_C' was not declared in this scope

解决:在 jni/ffmpeg/libavutil/common.h中添加
// add by XXX
#ifndef UINT64_C
#define UINT64_C(value)__CONCAT(value,ULL)
#endif
//-//



  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值