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中保存不带单位的数值,可以用如下格式来定义。

<item name="text_line_spacing" type="dimen" format="float">1.2</item>

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

<item name="top_weight" type="dimen" format="integer">5</item>

要在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设置有蒙版半透明背景的方法

<item name="android:backgroundDimEnabled">true</item>
<item name="android:backgroundDimAmount">0.42</item>

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

外层使用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会覆盖子类控件而直接获得焦点来轻松解决问题。

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

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:color="@color/white" android:state_pressed="true"></item>
        <item android:color="@color/dail_black" android:state_pressed="false"></item>
    </selector>

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

<style name= "text_mine_line">
    <item name="android:textSize">14dp</item>
    <item name="android:textColor">@color/color_666666</item>
    <item name="android:paddingStart">18dp</item>
    <item name="android:paddingEnd">18dp</item>
    <item name="android:drawableEnd">@mipmap/ic_more</item>
    <item name="android:gravity">center_verticall</item>
    <item name="android:drawablePadding">14dp</item>
    <item name="android:background">@drawable/shape_line_gray</item>
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">49dp</item>
</style>

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中设置

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" // 加入app命名空间
    android:layout_width="match_parent"
    android:layout_height="@dimen/dimen_45">

    <android.support.v7.widget.AppCompatTextView
        android:layout_width="@dimen/dimen_105"
        android:layout_height="@dimen/dimen_32"
        android:maxLines="1"
        android:textSize="@dimen/dimen_sp_12"
        android:textColor="@color/button_r_b_font_color" 
        app:autoSizeTextType="uniform" // 设置TextView大小设置样式为支持改变(none时为不支持改变)
        app:autoSizeStepGranularity="@dimen/lib_search_dimen_sp_1"   // 每次改变的尺寸阶梯
        app:autoSizeMinTextSize="@dimen/lib_search_dimen_sp_8" 
        app:autoSizeMaxTextSize="@dimen/lib_search_dimen_sp_12" /> 

</RelativeLayout>

在代码中动态设置

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="@dimen/dimen_45">

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/txt_price_section_item"
        android:layout_width="@dimen/dimen_105"
        android:layout_height="@dimen/dimen_32"
        android:background="@drawable/red_black_selector_bg"
        android:maxLines="1"
        android:textSize="@dimen/dimen_sp_12"
        android:textColor="@color/button_r_b_font_color" />
</RelativeLayout>

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

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的时候一定要添加<size> ,一定要添加color,即使是透明也要写上

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/black" />
    <size android:height="1px" android:width="1px" />
</shape>

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页面的源代码

        <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no"/>

如果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"有最小宽高,具体属性参数如下:

 <style name="Base.Widget.AppCompat.Button" parent="android:Widget">
        <item name="android:background">@drawable/abc_btn_default_mtrl_shape</item>
        <item name="android:textAppearance">?android:attr/textAppearanceButton</item>
        <item name="android:minHeight">48dip</item>
        <item name="android:minWidth">88dip</item>
        <item name="android:focusable">true</item>
        <item name="android:clickable">true</item>
        <item name="android:gravity">center_vertical|center_horizontal</item>
 </style>

解决方案

 <style name="MyButton_Style" parent="Base.Widget.AppCompat.Button">
        <item name="android:minHeight">0dip</item>
        <item name="android:minWidth">0dip</item>
    </style>

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

<item name="android:buttonStyle">@style/MyButton_Style</item>

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"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容