2016-09-16 67 views
6

enter image description here我在TextInputLayout中創建了一個EditText。我在我的代碼中在運行時將一個drawableLeft設置爲一個EditText,但是一旦我添加drawableLeft,TextInputLayout中的浮動提示就會向右移動,而留出等於可繪製寬度的空間。但我不想在提示空間,所以幫我解決這個問題!如果edittext位於TextInputlayout中,將一個drawableLeft添加到EditText將提示移向右側

+0

請發表您的XML –

+0

使用_setCompoundDrawablePadding_ – Piyush

回答

18

TextInputLayout使用輔助類 - CollapsingTextHelper - 來操作其提示文本。這個幫助器的實例是私有的,並且沒有任何與其佈局相關的屬性暴露出來,所以我們需要使用一點反射來訪問它。此外,每次佈局TextInputLayout時都會對其屬性進行設置和重新計算,因此子類TextInputLayout的子類很有用,覆蓋其方法onLayout(),並在那裏進行調整。

import android.content.Context; 
import android.graphics.Rect; 
import android.support.design.widget.TextInputLayout; 
import android.util.AttributeSet; 
import java.lang.reflect.Field; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

public class CustomTextInputLayout extends TextInputLayout { 
    private Object collapsingTextHelper; 
    private Rect bounds; 
    private Method recalculateMethod; 

    public CustomTextInputLayout(Context context) { 
     this(context, null); 
    } 

    public CustomTextInputLayout(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public CustomTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 

     init(); 
    } 

    @Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
     super.onLayout(changed, left, top, right, bottom); 

     adjustBounds(); 
    } 

    private void init() { 
     try { 
      Field cthField = TextInputLayout.class.getDeclaredField("mCollapsingTextHelper"); 
      cthField.setAccessible(true); 
      collapsingTextHelper = cthField.get(this); 

      Field boundsField = collapsingTextHelper.getClass().getDeclaredField("mCollapsedBounds"); 
      boundsField.setAccessible(true); 
      bounds = (Rect) boundsField.get(collapsingTextHelper); 

      recalculateMethod = collapsingTextHelper.getClass().getDeclaredMethod("recalculate"); 
     } 
     catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException e) { 
      collapsingTextHelper = null; 
      bounds = null; 
      recalculateMethod = null; 
      e.printStackTrace(); 
     } 
    } 

    private void adjustBounds() { 
     if (collapsingTextHelper == null) { 
      return; 
     } 

     try { 
      bounds.left = getEditText().getLeft() + getEditText().getPaddingLeft(); 
      recalculateMethod.invoke(collapsingTextHelper); 
     } 
     catch (InvocationTargetException | IllegalAccessException | IllegalArgumentException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

這種定製類是一個下拉更換爲正規TextInputLayout,你會用同樣的方式。例如:

<com.mycompany.myapp.CustomTextInputLayout 
    android:id="@+id/text_input_layout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:hint="Model (Example i10, Swift, etc.)" 
    app:hintTextAppearance="@style/TextLabel"> 

    <android.support.design.widget.TextInputEditText 
     android:id="@+id/edit_text" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:drawableLeft="@drawable/bmw" 
     android:text="M Series" /> 

</com.mycompany.myapp.CustomTextInputLayout> 

screenshot

+0

它不是現在正在返回一個錯誤** CollapsingTextHelper不是公衆android.support.design.widget;無法從外部包中訪問** –

+0

只需在課程頂部刪除「CollapsingTextHelper」導入即可。它在示例中並未實際使用。顯然,我只是在發佈之前忘記清理進口產品。 –

+1

感謝它的工作。 –

-1

是的,它是我最近遇到的一個常見問題。我用簡單的一行代碼解決了這個問題: 使用drawble padding在提示和drawbleleft之間填充填充。 如果您在運行時添加drawable,只需在手邊添加drawblepadding即可,或者您可以動態添加drawable填充。

-1
editText.setCompoundDrawablePadding(your padding value); 

試試吧,讓我知道。它爲我工作。

相關問題