我正试图找出一个很好的解决方案,如何扩展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>
答案 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类更容易。