Android 开发经验tips(1)

作者: 燊在锦官城 | 来源:发表于2016-07-06 15:55 被阅读254次

持续记录一些比较实用的开发技巧~

1. 扩展绘制

clipChild用来定义他的子控件是否要在他应有的边界内进行绘制。 默认情况下,clipChild被设置为true。 也就是不允许进行扩展绘制。

clipToPadding用来定义ViewGroup是否允许在padding中绘制。默认情况下,cliptopadding被设置为ture, 也就是把padding中的值都进行裁切了。


拓展绘制.png

2. ListView的局部刷新

找到要更新的那项的View,然后再根据业务逻辑更新数据即可

                    // 更新数据源
                    item.isDefault = dialog.getChecked();
                    item.invoiceTitle = dialog.getTitle();
                    // 刷新数据
                    holder.bindViews(item);

3. 文字是一行就居中,多行就居左

在TextView外套一层wrap_content的ViewGroup即可简单实现

<LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal">

                <TextView
                    android:id="@+id/tv_content"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:paddingBottom="25dp"
                    android:paddingLeft="20dp"
                    android:paddingRight="20dp"
                    android:text="123"
                    android:textColor="@color/black"
                    android:textSize="13dp" />

</LinearLayout>

4. MonkeyTest测试用例

根据不同项目修改包名(com.ct.client)即可
测试范例:
adb -s 0A3AAA1E0901D008 shell monkey -p com.ct.client --pct-touch 30 --pct-motion 20 --pct-trackball 10 --pct-appswitch 10 -s 12867 --ignore-crashes --ignore-timeouts -v 10000 --throttle 300 > c:\monkey_test.txt

5. 获取文字宽度

    public float getTextWidth(Context Context, String text, int textSize){
        TextPaint paint = new TextPaint();
        float scaledDensity = Context.getResource().getDisplayMetrics().scaledDensity;
        paint.setTextSize(scaledDensity * textSize);
        return paint.measureText(text);
    }

6. ScrollView中嵌套WebView时的焦点问题

外层使用ScroolView,内层嵌套使用WebView,每次进入Activity页面时,整个页面起始位置并不是顶部,这是因为WebView加载后获得焦点导致的(ListView也会出现类似问题,即使修正了高度,也会主动获得焦点,使得屏幕产生错误的滚动)
通过设置ScrollView包含的第一个viewgroup的

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:descendantFocusability="blocksDescendants" >

viewgroup会覆盖子类控件而直接获得焦点来轻松解决问题。

7. TextView设置部分文字颜色样式和监听

    /**
     * 将content 设置到 descId 中,并且content显示的颜色为 colorId
     *
     * @param content
     * @param descId 字符串资源id
     * @param colorId 颜色资源id
     * @return
     */
    public static SpannableStringBuilder getColorfulContent(String content, int descId, final int colorId, final Context mContext) {
        String part1 = String.format(mContext.getString(descId), content);
        if (TextUtils.isEmpty(content)) {
            return new SpannableStringBuilder(part1);
        }
        int start = part1.indexOf(content);
        int length = content.length() + start;
        SpannableStringBuilder ssBuilder = new SpannableStringBuilder(part1);
        ssBuilder.setSpan(new ClickableSpan() {
                              @Override
                              public void onClick(View widget) {
                                  Intent i = new Intent(mContext, OnlineBusinessWebkitActivity.class);
                                  i.putExtra("TITLE", "商城订单");
                                  i.putExtra("URL", Constants.SHOPPING_MALL_ORDER);
                                  mContext.startActivity(i);
                              }

                              @Override
                              public void updateDrawState(TextPaint ds) {
                                  super.updateDrawState(ds);
                                  ds.setColor(mContext.getResources().getColor(colorId)); // 设置文本颜色
                                  ds.setUnderlineText(false);// 去掉下划线
                              }

                          }, start, length,
                0);
        return ssBuilder;
    }

在setText之前调用

textView.setMovementMethod(LinkMovementMethod.getInstance()); // 必须加这句才能点击
textView.setHighlightColor(context.getResources().getColor(android.R.color.transparent));//点击后背景色为透明

8. scaleType设置图片不变形

// xml设置
android:scaleType="centerCrop"
// 代码中设置
mImage.setImageDrawable(bitmap);

注意此处setBackgroundDrawable将会导致scaleType设置失效,这个方法也确实过时了。

9. 临时数据使用 onSaveInstanceState 保存恢复,永久性数据使用 onPause 方法保存

@Override  
protected void onSaveInstanceState(Bundle outState) {  
    // TODO Auto-generated method stub  
    outState.putInt("currentposition", videoView.getCurrentPosition());  
    Log.v("tag", "onSaveInstanceState");  
    super.onSaveInstanceState(outState);  
}   

10. 设置按钮不可点击

button.setEnabled(false);
或者
button.setClickable(false);
  • 注意:
    setClickable(false)方法一定要在setOnClickListener()方法之后用;
    因为setOnClickListener()方法会重新绘制View;

11. 编辑框光标保持光标位于内容最后

setText之后设置:

etView.requestFocus();

否则先获得了焦点,后续再设置内容,此时焦点肯定是放在内容之前的了,则就需要额外调用setSelection去调整位置了

etView.setSelection(etView.getText().toString.length());

12. ImageView扩大点击区域

ImageView 直接设置其padding值达到目的,或者

android:scaleType="centerInside"
android:src="@drawable/ic_edit"

此时可以直接设置控件宽高来控制大小,注意不能用background,这会导致图片变形

我的博客(第一时间更新):
http://huangss.farbox.com/

相关文章

网友评论

本文标题:Android 开发经验tips(1)

本文链接:https://www.haomeiwen.com/subject/pcpkjttx.html