Android 常用控件tips

1. 用代码设置ImageView的src和background

设置ImageView的src:

setImageDrawable(Drawable drawable);
setImageBitmap(Bitmap bm);
setImageResource(int resId);

代码设置ImageView的background:

setBackgroundReource(int resid)
setBackground(Drawable background)
setBackgroundColor(int color)
setBackgroundDrawable(Drawable background) //This method was deprecated in API level 16. use setBackground(Drawable) instead

2. 在dimens.xml中保存不带单位的数值

要在dimens.xml中保存不带单位的数值,可以用如下格式来定义。

1.2

在上述定义中,type=”dimen”属性表示定义的item的资源类型是dimen类型。除了可以使用”dimen”外,还可以使用color,string,style等类型,但由于其他类型都可以直接定义,且没有数值的约束,所以一般不需要通过这种方法来定义。format=”float”属性表示定义的数值类型是float类型。除了”float”类型外,还可以使用boolean,fraction,integer等类型。例如:

5

要在xml中引用上述定义的dimens,可以使用@dimen/text_line_spacing。
要在代码中引用上述定义的dimens,可以使用如下代码。

TypedValue outValue = new TypedValue();
getResources().getValue(R.dimen.text_line_spacing, outValue, true);
float value = outValue.getFloat();

3. 在TextView中android:ellipsize="marquee"确保有效的方法

  • xml设置
            android:singleLine="true"
            android:ellipsize="marquee"
            android:marqueeRepeatLimit="marquee_forever"
  • 文字动态设置的话需要超出一行
  • 在当前控件是visible的情况下textView.setSelected(true);

4. Android自定义Dialog设置有蒙版半透明背景的方法

true
0.42

5. ScrollView中嵌套WebView时的焦点问题(ListView的item焦点抢夺同理)

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


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

6. 设置按钮不可点击

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

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

setText之后设置:

etView.requestFocus();

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

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

8. ImageView扩大点击区域

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

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

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

9. 禁止EditText自动获取焦点

android:focusable="true"   
android:focusableInTouchMode="true"

设置光标不可见

cursorVisible

10. TextView的文字也可以设置按下效果

新建 color/text_color_selector.xml

    
    
        
        
    

11. 一个控件设置TextView和两个icon


12. 监听ViewFlipper滑动的子View

public class MyViewFlipper extends ViewFlipper {
    public MyViewFlipper(Context context) {
        super(context);
    }

    public MyViewFlipper(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void showNext() {  //从继承关系中发现当子view变化的时候会调用该方法,因此在这里弄个回调
        super.showNext();
        mOnViewCountListener.viewCount(getDisplayedChild());
    }
   private OnViewCountListener mOnViewCountListener;
    public void setOnViewCountListener(OnViewCountListener mOnViewCountListener)
    {
        this.mOnViewCountListener=mOnViewCountListener;
    }
   public interface OnViewCountListener{
     void viewCount(int count);

   }
}

13. 官方提供的自动改变文本大小的TextView

在XML中设置




     


在代码中动态设置




    

在代码中进行改变字号的设置

TextViewCompat.setAutoSizeTextTypeWithDefaults(
    textView, TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM); 
TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(
    textView, 8, 25, 1, TypedValue.COMPLEX_UNIT_SP);
  • 控件的宽度和高度必须要有具体的值,不能设置为wrap_content
  • 单行显示需要使用maxLines="1"

14. 获取控件宽高建议使用的方法

  • 重写Activity的onWindowFocusChanged方法,在该方法中获取
@Override  
public void onWindowFocusChanged(boolean hasFocus) {  
    super.onWindowFocusChanged(hasFocus);  
    //此处可以正常获取width、height等  
} 
  • 将一个runnable添加到Layout队列中:View.post()
view.post(new Runnable() {  
    @Override  
    public void run() {  
        view.getHeight();  
    }  
});

15. 动态修改TextView的图片

Drawable drawable=getResources().getDrawable(R.drawable.ic_phone);
drawable.setBounds(0,0,30,35);//第一0是距左边距离,第二0是距上边距离,30、35分别是长宽
tv_phone.setCompoundDrawables(drawable,null,null,null);//只放左边
setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom)

如果想手动设置大小的话就要用setCompoundDrawables,事先要给Drawable设置setBounds。
如果按照原有比例大小显示图片就使用setCompoundDrawablesWithIntrinsicBounds

16. 在 LinearLayout 添加分割线 divider

LinearLayout有两个属性

1、divider

android:divider = ""

divider可以是图片文件,也可以是xml绘制的shape。
使用shape的时候一定要添加 ,一定要添加color,即使是透明也要写上



    
    

2、showDividers

android:showDividers = "middle|end|beginning|none"
  • middle 在每一项中间添加分割线
  • end 在整体的最后一项添加分割线
  • beginning 在整体的最上方添加分割线
  • none 无
  1. dividerPadding 设置间隔

17. clipToPadding

场景:常常用于paddingTop,假设内部有个属性设置了paddingTop,但是滑动的时候paddingTop的空间无法一起滑动则使用该属性
如设置

Android:clipToPadding=false

可以使列表的paddingTop跟随着一起滑动。

18. 编辑框切换设置不可编辑和可编辑

    /**
     * 设置编辑框不可编辑
     * @param editText
     */
    public static void setEditTextNotEdit(EditText editText){
        editText.setCursorVisible(false);
        editText.setFocusable(false);
        editText.setFocusableInTouchMode(false);
    }

    /**
     * 编辑框获取焦点
     * @param editText
     */
    public static void getEditFocus(EditText editText) {
        editText.setFocusable(true);
        editText.setFocusableInTouchMode(true);
        editText.setCursorVisible(true);
        editText.requestFocus();
        editText.requestFocusFromTouch();
        editText.setSelection(editText.getText().toString().length());
    }

19. 使RecyclerView 的当前Item居中显示

LinearSnapHelper & PagerSnapHelper

Google 内置了两个默认实现类,LinearSnapHelper和PagerSnapHelper。

  • LinearSnapHelper: 可以使RecyclerView 的当前Item 居中显示(横向和竖向都支持)
  • PagerSnapHelper: 使RecyclerView像ViewPager一样的效果,每次只能滑动一页(LinearSnapHelper支持快速滑动), PagerSnapHelper也是Item居中对齐。

20. Webview支持缩放并隐藏控制条

        webSettings.setSupportZoom(true); //支持缩放
        webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。
        webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件`

此外检查wap页面的源代码

        

如果user-scalable=no,或者initial-scale和maximum-scale,minimum-scale相等,是无法缩放的。

webView设置背景图片,如果直接给webView设置android:background是无效的,必须在Java代码中

webView.setBackgroundColor(0);

21. EditText可以弹出安全键盘的方法

editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
if (isShowPwd) {
    // 显示密码
    etPwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); 
}else{
    // 隐藏密码
    etPwd.setTransformationMethod(PasswordTransformationMethod.getInstance());
}

22. 列表中Glide加载图片大小显示不正常

android:adjustViewBounds="true"

adjustViewBounds只有在ImageView一边固定,一边为wrap_content的时候才有意义。设置为true的时候,可以让ImageView的比例和原始图片一样,以达到让图片充满的ImageView的效果。

23. 处理返回时关闭输入法的同时关闭dialog

重写EditText的onKeyPreIme方法,并设置回调来更新程序的UI

    @Override
    public boolean onKeyPreIme方法,并设置回调来更新程序的UI(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (listener != null) {
                listener.back(this);
            }
        }
        return false;
    }

24. 代码中动态添加radiobutton的间隔设置

设置间隔需要把setLayoutParams()放到addView之后,才有效果

RadioGroup.LayoutParams bt_params = new RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ScreenUtil.dp2px(50,this));
bt_params.setMargins(0,ScreenUtil.dp2px(10,this),0,0);
radioGroup.addView(radioButton);
radioButton.setLayoutParams(bt_params);

25. 点击ViewGroup时其子控件也变成pressed状态

让某个view自己能处理touch事件,也即设置clickable、longClickable为true;

26. 设置编辑框弹出输入法的一种办法

        private EditText searchEdit;
        searchEdit.setCursorVisible(false);
        searchEdit.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if(hasFocus){               
                    searchEdit.setCursorVisible(true);//点击后显示光标,弹出输入法
                }
            }
        });

在他的父级设置

android:focusableInTouchMode="true"
android:focusable="true"

27. 获取LinearLayout的宽度和高度

在调用这两个方法之前,必须调用View.measure方法先测量组件宽度和高度

linearlayout.measure(0,0);  
//获取组件宽度  
int width = linearlayout.getMeasuredWidth();  
//获取组件高度  
int height = linearlayout.getMeasuredHeight();  

28. NestedScrollView嵌套滑动RecycleView

mRecycleView.setNestedScrollingEnable(false);

29. AppCompat 主题中 Button 的默认 style 导致的图片变形问题

默认 style 是"Base.Widget.AppCompat.Button"有最小宽高,具体属性参数如下:

 

解决方案

 

在values/styles.xml文件的AppTheme style节点中添加如下代码:

@style/MyButton_Style

30. RadioGroup调用check(int)方法时,onCheckedChanged方法被执行两次

改为直接根据id获取子RadioButton对象来setChecked()

((RadioButton)mListenKindGroup.findViewById(R.id.listen_kind_group)).setChecked(true);

31. ImageView setAlpha(float)、setAlpha(int)及setImageAlpha(int)的区别

  • setAlpha(float)推荐使用,取值范围为0.0f-1.0f,透明到不透明
  • setAlpha(int),已废弃,不推荐使用,取值范围为1-255,表示透明到不透明
  • setImageAlpha(int),取值范围1-255,表示透明到不透明

32. RelativeLayout的circular dependency问题

如果 RelativeLayout 的 height 是 wrap_content,而且它的子控件是 ALIGN_PARENT_BOTTOM,就会产生 circular dependency,导致布局铺满全屏。

  • 解决方案:1. 动态设置布局高度 2. 替换成 LinearLayout 或其他布局。

33. EditText禁止回车键换行

android:inputType="text"

你可能感兴趣的:(Android 常用控件tips)