如何使用清除按钮制作可重复使用的EditText?

时间:2012-04-20 00:55:55

标签: android android-layout android-widget android-ui android-custom-view

我想制作一个带有清除按钮的EditText复合控件。由于主要功能将是EditText功能,我希望它在布局xmls中可以使用EditText的所有属性进行声明。但是,它实际上是一个带有EditText和ImageButton的LinearLayout。

另外,我希望它可以像代码中的EditText一样使用,所以我可以将其作为替代品放入。

到目前为止我有这个布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:background="@android:drawable/editbox_background" >
    <EditText 
        android:id="@+id/editText"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_gravity="center_vertical"
        android:background="#FFF" />
    <ImageButton
        android:id="@+id/clear"
        android:src="@drawable/clear_text"
        android:background="#FFF"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical" />
</LinearLayout>

但我不确定如何继续。如果我需要将EditText作为LinearLayout来使用此布局,如何定义一个扩展EditText的控件?或者我唯一的选择是在onDraw()中手动绘制x并自己处理点击?

2 个答案:

答案 0 :(得分:0)

 public class myedittext extends LinearLayout{
 EditText e1;
  ImageButton ib;
  OnClickListener cleartext;
 public myedittext(Context c){
  super(c);
   String inflater=context.LAYOUT_INFLATER_SERVICE;
  LayoutInflater lif;
  li=(LayoutInflater)getContext().getSystemService(inflater);
  li.inflate((R.layout.yourlayoutname,this,true);
 e1=(EditText)findViewById(R.id.editText);
   ib=(ImageButton)findViewById(R.id.clear);


  cleartext = new OnClickListener(){

    @Override
    public void onClick(View v) {

        e1.setText("");
    }
   };
  ib.setOnClickListener(cleartext);
 }
   }

答案 1 :(得分:-1)

您可以声明一个自定义视图类,它与您的XML一样从LinearLayout扩展。然后加载Xml并将其添加到自定义视图中。

如果要在XML中使用它,首先应该通过attrs.xml声明自己的XML属性,如下所示

<declare-styleable name="CustomEditText">
    <attr name="text" format="string" />
</declare-styleable>

然后使用Attributes attrs覆盖构造函数并解析attrs,如下面的代码

TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.CustomEditText);
CharSequence s = a.getString(R.styleable.CustomEditText_text);
setText(s.toString());

在XML中使用它:

xmlns:anything="http://schemas.android.com/apk/res/yourpackagename" // for declare your namespace
<yourpackagename
        android:background="@drawable/blue"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        anything:text="hi"/>

要像代码中的editText一样使用它,只需包装自定义视图类。