Android 复习学习使用android技术

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

2021-03-29  本文已影响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.实现效果

实现效果
上一篇下一篇

猜你喜欢

热点阅读