java化改造--xml布局文件转成java——学习整理

版权声明:出于感谢(如果有收获)或对知识的尊重,未经允许禁止转载 https://blog.csdn.net/bendan50/article/details/81734989

目录

一、TextView设置字体大小setTextSize()方法参数选择单位

二、TextView设置颜色setTextColor()方法的参数选择

三、相对布局RelativeLayout中android:layout_toLeftOf="@id/sso_send_sms_code"的实现

四、RelativeLayout.LayoutParams变量设置边界无效的解决方案

五、EditText控件中设置输入类型的XML和Java写法并设置长度限制(使用过滤器)


一、TextView设置字体大小setTextSize()方法参数选择单位

UI设计给出的界面中字体有大小,比如25sp,然后mTextView.setTextSize(25),通过该方法设置是选择默认单位。翻阅了下API,截图如下:

还有一个重载的方法setTextSize(int unit, int size);

对于第一个参数,可取下列值:标记了单位

扫描二维码关注公众号,回复: 3240550 查看本文章
TypedValue.COMPLEX_UNIT_PX : Pixels
TypedValue.COMPLEX_UNIT_SP : Scaled Pixels
TypedValue.COMPLEX_UNIT_DIP : Device Independent Pixels

二、TextView设置颜色setTextColor()方法的参数选择

翻API或者在IDE中输入都会发现其有两个重载,如图:

第一个比较好理解:setTextColor(Color.parseColor("#ff3eff04"));

第二个涉及一个新类:ColorStateList,状态列表。其实根据第一个方法可知,就是设置normal,selected,focused不同状态下对应的颜色值。

先贴下XML中对ColorStateList的实现方式:

            <TextView
            android:id="@+id/sso_send_sms_code"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/sso_str_bind_phone_smscode_Bt"
            android:textColor="@drawable/selector_ivr_text_color"
            android:textSize="@dimen/dimen_12sp"
            android:layout_centerVertical="true"
            android:layout_alignParentRight="true"
            />
<!--sso_str_bind_phone_smscode_Bt文件内容-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/white" android:state_enabled="true" />
    <item android:color="@color/sso_color_new_main_theme" />
</selector>

再来贴下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;  
    }  

三、相对布局RelativeLayout中android:layout_toLeftOf="@id/sso_send_sms_code"的实现

打开API之后,找各种方法,终于看到了一个类似的:

因此代码可以写成:其中layoutParams1为RelativeLayout.LayoutParams变量

        layoutParams1.addRule(RelativeLayout.LEFT_OF,mResendValidCodeTxt.getId());

四、RelativeLayout.LayoutParams变量设置边界无效的解决方案

无效的代码:

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文件

<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/dimen_50dp"
        android:layout_marginLeft="@dimen/dimen_30dp"
        android:layout_marginRight="@dimen/dimen_30dp"
        android:layout_marginTop="@dimen/dimen_47dp"
        >

五、EditText控件中设置输入类型的XML和Java写法并设置长度限制(使用过滤器)

其XML文件代码:

<EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@id/sso_send_sms_code"
            android:layout_centerVertical="true"
            android:layout_marginRight="@dimen/dimen_26dp"
            android:inputType="number"
            android:maxLength="6"
            android:hint="@string/str_smsmlogin_smscode_edit_hint"
            android:textColorHint="@color/sso_color_new_main_theme"
            android:textSize="@dimen/dimen_14sp"
            android:textCursorDrawable="@drawable/sso_shape_cursor"/>

转换成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了,知道去哪找就好。


六、android:descendantFocusability = "blocksDescendants"

其转为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会覆盖子类控件而直接获得焦点


七、<TextView android:lineSpacingMultiplier = "1.3"

设置线宽,转成Java

 mTipTv.setLineSpacing(0,1.3f);

该方法有两个参数,add 和 mult

计算结果为: 原单位*mult + add。

所以,上面结果为 :1 * 1.3 + 0 = 1.3


八、

猜你喜欢

转载自blog.csdn.net/bendan50/article/details/81734989
今日推荐