0

我想找出一個很好的解決方案,如何擴展EditText,讓我有頂層的其他視圖。我正在試圖製作一個自定義的View,它是一個EditText,它具有頂部的TextView以顯示字符數量,頂部的ImageView用於清除按鈕。Android - 自定義視圖 - 擴展EditText與頂部視圖

目前,我有擴展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

只要使用此佈局並在文本視圖中顯示數字並在編輯文本中輸入時可以實現同樣的功能嗎?清除編輯文本也是一樣。在我看來,ButterKnife在這裏的用法有點矯枉過正。因此,創建可以以其他方式安排的功能的自定義視圖。如果我錯過了一些東西,想了解走很長的路的原因。 – daxgirl

+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類更容易。

+0

這是一個有趣的解決方案,但我認爲它不適用於我想要完成的工作。我想擴展EditText,所以我可以通過代碼/ xml直接修改它。例如,如果我希望EditText在一個Activity中是多行的,但不在另一個Activity中,我需要多個佈局或該Activity中的許多代碼與您的方法,而不是在擴展類中。 –

+0

這就是爲什麼我說你可以在MyComplexView類中添加各種方法來操縱對象。您只需添加一個像setEditTextMultine(布爾標誌)的方法,您可以在其中製作EditText多行文件 – Anonymous

+0

您不能擴展EditText以執行您所描述的內容。您必須擴展View類並從開始構建自定義視圖。這是比這更多的代碼。更新了答案。在創建對象之後,您可以將其設爲多行或不行。關於視圖programmaticaly,您無法操作的東西極其稀少 – Anonymous