目录
一、TextView设置字体大小setTextSize()方法参数选择单位
二、TextView设置颜色setTextColor()方法的参数选择
三、相对布局RelativeLayout中android:layout_toLeftOf="@id/sso_send_sms_code"的实现
四、RelativeLayout.LayoutParams变量设置边界无效的解决方案
五、EditText控件中设置输入类型的XML和Java写法并设置长度限制(使用过滤器)
六、android:descendantFocusability = "blocksDescendants"
七、TextView android:lineSpacingMultiplier = "1.3"
UI设计给出的界面中字体有大小,比如25sp,然后mTextView.setTextSize(25),通过该方法设置是选择默认单位。翻阅了下API,截图如下:
还有一个重载的方法setTextSize(int unit, int size);
对于第一个参数,可取下列值:标记了单位
TypedValue.COMPLEX_UNIT_PX : Pixels
TypedValue.COMPLEX_UNIT_SP : Scaled Pixels
TypedValue.COMPLEX_UNIT_DIP : Device Independent Pixels
翻API或者在IDE中输入都会发现其有两个重载,如图:
第一个比较好理解:setTextColor(Color.parseColor("#ff3eff04"));
第二个涉及一个新类:ColorStateList,状态列表。其实根据第一个方法可知,就是设置normal,selected,focused不同状态下对应的颜色值。
先贴下XML中对ColorStateList的实现方式:
再来贴下Java中对ColorStateList的实现方式
/** 对TextView设置不同状态时其文字颜色。 */
private ColorStateList createColorStateList(int normal, int pressed, int focused, int unable) {
int[] colors = new int[] { pressed, focused, normal, focused, unable, normal };
int[][] states = new int[6][];
states[0] = new int[] { android.R.attr.state_pressed, android.R.attr.state_enabled };
states[1] = new int[] { android.R.attr.state_enabled, android.R.attr.state_focused };
states[2] = new int[] { android.R.attr.state_enabled };
states[3] = new int[] { android.R.attr.state_focused };
states[4] = new int[] { android.R.attr.state_window_focused };
states[5] = new int[] {};
ColorStateList colorList = new ColorStateList(states, colors);
return colorList;
}
打开API之后,找各种方法,终于看到了一个类似的:
因此代码可以写成:其中layoutParams1为RelativeLayout.LayoutParams变量
layoutParams1.addRule(RelativeLayout.LEFT_OF,mResendValidCodeTxt.getId());
无效的代码:
RelativeLayout.LayoutParams relativeLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,50);
relativeLayoutParams.setMargins(30,30,30,0);
有效代码:
LinearLayout.LayoutParams relativeLayoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,50);
relativeLayoutParams.setMargins(30,30,30,0);
说明:在Root(根布局为LinearLayout)视图下,子视图间设置边距,使用RelativeLayout无效,虽然当前的子视图是RelativeLayout布局。
对应转换之前的XML文件
其XML文件代码:
转换成Java代码
mValidCodeView.setInputType(InputType.TYPE_CLASS_NUMBER);
mValidCodeView.setFilters(new InputFilter[]{new InputFilter.LengthFilter(6)}); //对应布局中的android:maxLength=6
mValidCodeView.setHint("验证码");
此处需要贴一下API,感悟下心得:你要的东西,在API中都可以找到,需要做的是去找,如果还不能记住的话。
API中会给出XML对应的Java函数。此乃其一。
此乃其二。过滤器setFilters()的详细信息不在此贴API了,知道去哪找就好。
其转为Java的表述为:
LinearLayout rootLayout = new LinearLayout(mContext);
LinearLayout.LayoutParams rootParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
rootLayout.setOrientation(LinearLayout.VERTICAL);
rootLayout.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
rootLayout.setBackgroundColor(Color.TRANSPARENT); //透明
含义:
主要是焦点的传递问题,子视图是否可以获取焦点。
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
设置线宽,转成Java
mTipTv.setLineSpacing(0,1.3f);
该方法有两个参数,add 和 mult
计算结果为: 原单位*mult + add。
所以,上面结果为 :1 * 1.3 + 0 = 1.3
八、