美文网首页Android 复习学习使用android技术
Android笔记——组合控件实现自定义View之可清空内容的E

Android笔记——组合控件实现自定义View之可清空内容的E

作者: 麦香菌 | 来源:发表于2021-03-29 16:48 被阅读0次

    之前用输入框时是用的别人的框架MaterialEditText,但看该框架似乎没有一键清空输入框的功能,所以迫不得已自己写了一个。
    一开始想是自定义View,要用Java动态写各个控件的布局等等,觉得很麻烦,后来发现可以先在layout里写控件的布局,然后用类继承RelativeLayout(前面写的布局是用的RelativeLayout)并加载写好的组合控件就可以实现自定义View。

    1.public_edittext

    首先是组合控件的代码和实现效果

    <?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/pedit_hight"
        android:background="@drawable/white_border_grey">
    
        <TextView
            android:id="@+id/txt_tip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:text="提示"
            android:layout_marginLeft="10dp"
            android:textColor="@color/black"
            android:textSize="@dimen/text_size_18"/>
        <EditText
            android:id="@+id/edt_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_toRightOf="@+id/txt_tip"
            android:layout_marginLeft="30dp"
            android:textCursorDrawable="@drawable/edit_cursor"
            android:layout_toLeftOf="@+id/img_empty"
            android:layout_marginRight="10dp"
            android:background="@null"/>
        <ImageView
            android:id="@+id/img_empty"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/empty"
            android:layout_alignParentRight="true"
            android:visibility="visible"/>
    
    </RelativeLayout>
    
    效果图.png

    2.PublicEdit.java

    然后编写一个class继承RelativeLayout,再加载public_edittext,并为该控件编写自定义属性。
    自定义的属性首先要在values中创建attrs.xml文件,并在里面编写具体的自定义属性。


    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="PublicEdit">
            <attr name="tip" format="string" />
            <attr name="empty" format="boolean" />
            <attr name="hint" format="string"/>
        </declare-styleable>
    </resources>
    

    自定义View的源码如下。

    package com.mils.banke.publicWidget;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    
    import com.mils.banke.R;
    
    public class PublicEdit extends RelativeLayout {
    
        private TextView txt_tip;
        private ImageView img_empty;
        private EditText edt_content;
        private String tip;
        private Boolean empty;
        private String hint;
    
        public void initView(Context context){
            View.inflate(context, R.layout.public_edittext, this);
            txt_tip = (TextView)findViewById(R.id.txt_tip);
            img_empty = (ImageView)findViewById(R.id.img_empty);
            edt_content = (EditText)findViewById(R.id.edt_content);
        }
    
    
        public PublicEdit(Context context) {
            super(context);
            initView(context);
        }
    
        public PublicEdit(Context context, AttributeSet attrs) {
            super(context, attrs);
            initView(context);
            TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.PublicEdit);
            tip = ta.getString(R.styleable.PublicEdit_tip);
            empty = ta.getBoolean(R.styleable.PublicEdit_empty, false);
            hint = ta.getString(R.styleable.PublicEdit_hint);
            initWidget(tip,empty, hint);
        }
    
        public PublicEdit(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            initView(context);
        }
    
        private void setContentHint(String hint){
            edt_content.setHint(hint);
        }
    
        private void initWidget(String tip, Boolean empty, String hint){
            txt_tip.setText(tip);
            if (empty){
                img_empty.setVisibility(VISIBLE);
                img_empty.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        edt_content.setText("");
                    }
                });
            }
            else
                img_empty.setVisibility(GONE);
            edt_content.setHint(hint);
        }
    }
    

    3.控件使用

    <?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="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:background="@color/lightgrey">
    
        <include
            android:id="@+id/public_header"
            layout="@layout/public_header"/>
    
        <com.mils.banke.publicWidget.PublicEdit
            android:id="@+id/pedt_name_ue"
            android:layout_width="match_parent"
            android:layout_height="@dimen/pedit_hight"
            android:layout_below="@+id/public_header"
            app:tip="姓名"
            app:empty="true"
            android:layout_marginTop="30dp"/>
        <com.mils.banke.publicWidget.PublicEdit
            android:id="@+id/pedt_snumber_ue"
            android:layout_width="match_parent"
            android:layout_height="@dimen/pedit_hight"
            android:layout_below="@+id/pedt_name_ue"
            app:tip="学号"
            app:empty="true"
            android:layout_marginTop="30dp"/>
    
        <com.mils.banke.publicWidget.PublicEdit
            android:id="@+id/pedt_gender_ue"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_below="@+id/pedt_snumber_ue"
            app:tip="性别"
            android:layout_marginTop="30dp"/>
    
        <com.mils.banke.publicWidget.PublicEdit
            android:id="@+id/pedt_school_ue"
            android:layout_width="match_parent"
            android:layout_height="@dimen/pedit_hight"
            android:layout_below="@+id/pedt_gender_ue"
            app:tip="学校"
            android:layout_marginTop="30dp"/>
    
        <com.mils.banke.publicWidget.PublicEdit
            android:id="@+id/pedt_department_ue"
            android:layout_width="match_parent"
            android:layout_height="@dimen/pedit_hight"
            android:layout_below="@+id/pedt_school_ue"
            app:tip="院系"
            android:layout_marginTop="30dp"/>
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/pedt_department_ue"
            android:layout_marginTop="60dp"
            android:background="@drawable/btn_rounded_blue"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:text="确认修改"
            android:textColor="@color/white"/>
    
    </RelativeLayout>
    

    4.实现效果

    实现效果

    相关文章

      网友评论

        本文标题:Android笔记——组合控件实现自定义View之可清空内容的E

        本文链接:https://www.haomeiwen.com/subject/zhvbhltx.html