Android - 自定义视图 - 使用顶部视图扩展EditText

时间:2016-05-11 00:31:58

标签: java android android-edittext android-custom-view butterknife

我正试图找出一个很好的解决方案,如何扩展EditText以允许我将其他视图分层。我正在尝试制作一个自定义View,它是一个EditText,顶部有一个TextView来显示字符数,而顶部有一个ImageView,用于清除按钮。

目前,我正在使用扩展FrameLayout,但这并没有给我提供我正在寻找的控制/灵活性。比如我不能使用ButterKnife的@OnTextChanged,因为它需要TextView,除非我通过它,否则我无法直接访问EditText的任何XML属性。

感谢您的时间。

ClearableEditText.java

public class ClearableEditText extends FrameLayout {

    public ClearableEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    protected void init() {
        View inflate = inflate(getContext(), R.layout.clearable_edit_text, this);
        ButterKnife.bind(this, inflate);
        ...
    }

    ...
}

R.layout.clearable_edit_text.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <EditText
        android:id="@+id/clearable_edit"
        style="@style/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" />

    <ImageView
        android:id="@+id/clearable_clear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:layout_marginRight="10dp"
        android:layout_marginTop="5dp"
        android:src="@drawable/button_clear"
        android:visibility="invisible"
        tools:visibility="visible" />


    <TextView
        android:id="@+id/clearable_count"
        style="@style/edit_text_number"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|right"
        tools:text="1200" />
</FrameLayout>

1 个答案:

答案 0 :(得分:1)

我发现在这些情况下使用xml中的空布局会更简单,我稍后会在运行时使用我想要的任何元素填充它。例如:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView ..... />
    <Button........./>
    .
    .
    .
    <LinearLayout 
        android:id="@+id/container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>


</LinearLayout>

并在活动中

LayoutInflater inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout container = (LinearLayout)findViewById(R.id.container);
MyComplexView myComplexView = new MyComplexView(inflater, container);

MyComplexView:

    public static class MyComplexView{

        LinearLayout container;
        LayoutInflater inflater;
        TextView textView ;
        ImageView img;
        EditText editText;

        public MyComplexView(LinearLayout container,LayoutInflater inflater ){
            this.container = container;
            this.inflater = inflater;
            View v = (View) inflater.inflate(R.layout.mylayout, null);
            container.addView(v);
            textView = (TextView)v.findViewById(R.id.textview);
            img = (ImageView)v.findViewById(R.id.imgaviev);
            editText = (EditText)v.findViewById(R.id.edittext);
            // assign whatever text change listeners or on click listeners you want
        }

        public void makeEditTextMultiline(boolean flag){
            if(flag){    
                edittext.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_FLAG_MULTI_LINE); 
            }
            else{
                edittext.setSingleLine(true);
            }
        }
        public String getEditTextText(){
            return editText.getText().toString();
        }

    }

之后,您可以在MyComplexView类中创建各种方法来操作对象。

我认为这比扩展View类更容易。