Android 开发经验tips(1)

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

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即可简单实现



                


4. 获取文字宽度

    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);
    }

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

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


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

6. 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));//点击后背景色为透明

7. scaleType设置图片不变形

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

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

8. 临时数据使用 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);  
}   

9. 设置按钮不可点击

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

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

setText之后设置:

etView.requestFocus();

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

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

11. ImageView扩大点击区域

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

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

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

你可能感兴趣的:(Android 开发经验tips(1))