您的位置:首页 > 移动开发 > Android开发

Android总结(2012.07.08)

2015-09-23 12:36 489 查看
0.不要创建不需要的对象

1.除非创建API,否则使用HashMap而不是map

2.不改变逻辑的情况下能静态的静态

3.避免内部的getter/setter方法

4.Constants中使用static final变量

5.loog要比For循环速度快

6.Consider Package Instead of Private Access with Private Inner Classes

7.谨慎使用浮点型

8.让键盘没有黑色背影 设置SoftInputMode 为ADJUST_PAN

==================================以下为别人整理=========================================

1:Android Permission denied(不允许连接Socket) 错误

原因是: 需要访问到网络,所以,在AndroidManifest.xml中,需要进行如下配置:

2:ListView滚动变黑解决方法

ListView增加一个属性android:cacheColorHint=”#00000000”

3:Item用自己的背景盖住了Selector光标

ListView增加一个属性:android:drawSelectorOnTop=”true”这样光标就会跑到Item上面的图层

4:在利用Tab标签(自定义按钮)实现不同Activity切换,不同Activity均已经设置了模式为singleTask或singleInstance时,但是每次点击Tab标签中的特定Activity时,每次都还是会执行

onCreate方法,原因如下:

1:管理Tab标签(实现Activity切换的Tab标签)的容器(Activity)必须继承ActivityGroup

2:Activity设置的启动模式必须为singleTask或singleInstance

3:LocalActivityManager中的startActivity方法对于的Activity对应的ID,必须为需要跳转过去的Activity名称,否则失效。

4:存放tab标签(自定义按钮)对应的layout中必须有一个FrameLayout放置子activity。

5:模拟器提示访问网络出现如下异常:

java.net.UnknownHostException: Host is unresolved

原因是模拟器没有开通代理访问网络。

6:开发过程中,当listview控件中有button、checkbox等控件时,可能是由于这些子控件中获取到了focus事件,导致listview中onItemClick事件失效,只需要按如下方式处理即可:

1)每一个控件重新设置focusable属性

2)Item Layout的根控件设置其android:descendantFocusability=”blocksDescendant”即可

7:开发自定义控件步骤

1)创建res/values

private void setListViewPositon(ListView sourceListView, ListView desListView)

{

if (null != sourceListView && null != desListView)

{

int[] location = new int[2];

if (0 == listViewYLocation)

{

//获取该VIEW控件相对于手机屏幕的绝对坐标位置

desListView.getLocationOnScreen(location);

listViewYLocation = location[1];

}

[code]        if (sourceListView.getCount() > 0)
        {
            //获取源ListView中第一个显示的item---在ListView中,使用getChildAt(index)的取值,只能是当前可见区域(列表可滚动)的子项!
            View convertView = sourceListView.getChildAt(0);
            if (null != convertView)
            {
                //view距离屏幕顶端距离
                int convertViewLocationY = 0;

                //ListView中item距离ListView的顶部距离
                int itemLocationY = 0;
                //获取该VIEW控件相对于手机屏幕的绝对坐标位置
                convertView.getLocationOnScreen(location);
                convertViewLocationY = location[1];
                itemLocationY = - (listViewYLocation - convertViewLocationY);
                int selectIndex = sourceListView.getFirstVisiblePosition();
                desListView.setSelectionFromTop(selectIndex, itemLocationY);
            }
        }
    }
}


63:

[code]private boolean isFirstItemVisible()
{
    if (mChatListView != null)
    {
        if (mChatListView.getCount() == 0)
        {
            return true;
        }
        else if (mChatListView.getFirstVisiblePosition() == 0)
        {
            final View firstVisibleChild = mChatListView.getChildAt(0);
            final View secondVisibleChild = mChatListView.getChildAt(1);

            // 只要Listview中的第一个item是Loading,则触发请求,不论该item在屏幕中可见部分是多少像素。
            if (firstVisibleChild != null && firstVisibleChild == headerView)
            {
                //开始执行加载Loading动画
                headerView.startAnimation(animationHeaderLoading);
                int[] firstVisibleLocation = new int[2];
                int[] listviewLocation = new int[2];
                if (null != firstVisibleChild)
                {
                    // 获取该VIEW控件相对于手机屏幕的绝对坐标位置
                    firstVisibleChild.getLocationOnScreen(firstVisibleLocation);
                    secondVisibleItem = (GroupMessageItem) secondVisibleChild.getTag();
                    firstVisibleYLocation = firstVisibleLocation[1];

                    mChatListView.getLocationOnScreen(listviewLocation);
                    listviewYLocation = listviewLocation[1];
                }
                return true;
            }
        }
    }

    return false;
}


64:Listview特别之处:

1)由于listivew删除头部的前提条件是1)header先要add至listview;2)listview.setAdapter,再可以remove头部

2)如果需要做listview整体上移动作,而listview顶部右一个布局问题,需要实现listivew上移动画是在该布局的下面完成,由于listivew整体移动时依据以其父布局文件,

故而listivew一定要控制在其父布局下面即可。

3)如果listview执行上移动画时,底部会出现空白区域,解决思路可以尝试对包含Listview的容器截图,对图片进行移动。

titleLayout.setDrawingCacheEnabled(true);

titleLayout.buildDrawingCache();

Bitmap bitmap = titleLayout.getDrawingCache();

animationImageView.setImageBitmap(bitmap);

animationImageView.setVisibility(View.VISIBLE);

titleLayout.setVisibility(View.INVISIBLE);

[code]         translateAnimation = new TranslateAnimation(0f, 0f, 0f, -lineViewFlow.getHeight());
         translateAnimation.setDuration(animationMillilis);
         animationImageView.startAnimation(translateAnimation);
         lineViewFlow.setVisibility(View.GONE);


65:旋转动画,如果出现没有按照中心点运行,可能的原因就是布局问题。

66:如果需要做在指定的时间内容界面无任何操作,执行某个动作,可以通过发送延时Handle。

67:动画执行和Ui操作不同步时,导致的原因可能是布局文件的层次结构导致。

68:如果布局需要实现上下两层的话,可以通过RelativeLayout实现,同时最上面的布局,应该放置在布局文件的最底部

69:如果view设置成View.INVISIBLE后,未生效,可能的原因

1)布局的问题

2)view是否设置了setFillAfter(true);

70:Android客户端布局文件中的每个空间的位置如果相对于布局本身不动的话,则离左边、右边、上边、下边都是为0,所以大家在理解布局文件的的元素布局是一定要搞清楚,为0的意思不是在手机最顶部的原点位置,切记!

71:性能优化和体验优化总结

1)如果在支持比较费时的操作且需要用户立刻显示界面时,可以采用AsynTask、发送延时Handler、Thread等。

72:Application ‘com.hotalk’ has its ‘debuggable’ attribute set to FALSE and cannot be debugged.

是由于AndroidManifest.xml文件中的Application中设置了debug模式.

73:如果运行eclipse时,出现ADB server didn’t ACK * failed to start daemon * error: unknown host service问题,且通过重启adb、eclipse、升级adt,都无效时,可以考虑如下:

1)到任务栏清除ADB.exe

2)关闭PC上面的手机连接助手工具进程。

3)重启adb

74:Android 实现Activity后台运行

第一种方法

Intent intent = new Intent(Intent.ACTION_MAIN);

intent.addCategory(Intent.CATEGORY_HOME);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

第二种方法:此方法其实不是主要是屏蔽Keycode_Back,让它不结束(finish())Activity,直接显示HOME界面。

PackageManager pm = getPackageManager();

ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), 0);

if (keyCode == KeyEvent.KEYCODE_BACK)

{

ActivityInfo ai = homeInfo.activityInfo;

Intent startIntent = new Intent(Intent.ACTION_MAIN);

startIntent.addCategory(Intent.CATEGORY_LAUNCHER);

startIntent.setComponent(new ComponentName(ai.packageName,

ai.name));

startActivitySafely(startIntent);

return true;

}

else

{

return super.onKeyDown(keyCode, event);

}

75:解决出现ANR问题的部分技术细节

1)错误的使用SQLiteDatabase事物,需要捕获潜在的异常,不要因为未调用的transExecSQL中的endTransaction方法,导致30秒异常

2)重复Handler注册和发送信息

76:eclipse启动日志中出现如下异常: * java list.cache’ not found.

解决方法:删除eclipse对应workspace下面的.metadata文件夹
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: