2016-01-08 3 views
6

Ist es möglich, das TextInputLayout-Label oberhalb des linken Drawable eines EditText senkrecht zu zeigen, wenn Benutzer den EditText fokussiert oder typisiert. HierTextInputLayout Beschriftung nach Achor über dem linken Zeichenbereich eines EditText

ist die xml des EditText:

<android.support.design.widget.TextInputLayout 
       android:id="@+id/completion_date_layout2" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginLeft="5dp" 
       android:layout_marginRight="5dp" 
       android:layout_weight="1" 
       android:orientation="horizontal"> 

       <EditText 
        android:id="@+id/etTaskDate" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:hint="@string/title_completion_date" 
        android:inputType="text" 
        android:drawableLeft="@drawable/ic_date" 
        android:paddingBottom="15dp" 
        android:drawablePadding="5dp" 
        android:textSize="@dimen/fields_text_size"/> 
      </android.support.design.widget.TextInputLayout> 

Hier ist die gewünschte Ausgabe:

enter image description here

Hier ist die Ausgabe, die ich erhalte:

enter image description here

+2

Haben Sie jemals eine Lösung gefunden? Ich habe das gleiche Problem. –

+0

@RaymonddelaCroix Leider mein Freund nicht seit letzten Monat. Ich habe unten den Workaround, den ich getan habe, gepostet. :) – icaneatclouds

Antwort

3

Dank Java-Mitglied Zugangsmodell und Entwickler von Google, die eine kleine Lücke ließ es mit einem einfachen Subklassifizieren erreicht werden könnte, die ein Minimum des ursprünglichen Codes wiederholt:

package android.support.design.widget; 

import android.content.Context; 
import android.graphics.Rect; 
import android.util.AttributeSet; 

public final class TextInputLayoutEx extends TextInputLayout { 

    private final int mDefaultPadding = __4DP__; 
    private final Rect mTmpRect = new Rect(); 

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

    @Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
     super.onLayout(changed, left, top, right, bottom); 
     if (isHintEnabled() && mEditText != null) { 
      final Rect rect = mTmpRect; 
      ViewGroupUtils.getDescendantRect(this, mEditText, rect); 
      mCollapsingTextHelper.setCollapsedBounds(
       rect.left + mDefaultPadding, getPaddingTop(), 
       rect.right - mDefaultPadding, bottom - top - getPaddingBottom()); 
      mCollapsingTextHelper.recalculate(); 
     } 
    } 

} 

Hier sind wir auf die eine neue Klasse setzen Das gleiche Paket, das einen Zugriff auf die mCollapsingTextHelper mit einer Sichtbarkeit auf Paketebene öffnet und dann einen Teil des Codes aus der ursprünglichen onLayout-Methode wiederholt, die die Positionierung des Feldnamens verwaltet. Der __4DP__ Wert ist 4dp Wert in Pixel konvertiert, ich bin ziemlich sicher, dass jeder eine Hilfsmethode dafür hat.

in Ihrem XML-Layout wechseln gerade vom android.support.design.widget.TextInputLayout-android.support.design.widget.TextInputLayoutEx so sieht Ihr Layout wie folgt aus:

<android.support.design.widget.TextInputLayoutEx 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:hint="Mobile"> 
    <android.support.design.widget.TextInputEditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:drawableLeft="@drawable/ic_phone_black_24dp" 
     android:drawablePadding="4dp"/> 
</android.support.design.widget.TextInputLayoutEx> 

Und das Ergebnis ist

Collapsed and expanded state

Im Moment ist es für com.android.support:design:25.3.1 arbeitet

+0

Wird dies an einem anderen Projekt versuchen. Danke – icaneatclouds

+0

EPIC, arbeitete wie ein Charme. @icaneatclouds betrachten diesen Code als "die Antwort". – MiguelCatalan

-1

Ich habe ein Workarun gemacht d in Bezug auf dieses Problem. Es mag ein wenig unzuverlässig sein, aber es funktioniert an meinem Ende. Hier ist der Code:

String spacer="  "; 
EditText myEditText= (EditText)findViewById(R.id.myEditText); 
myEditText.setText(spacer + "Today"); 
myEditText.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_calendar, 0, 0, 0); 

Was ich hier tat, war einen Abstandhalter vor dem Text innerhalb des editText platzieren, dann fügen Sie die ziehbar programmatisch nach links.

Aber stellen Sie sicher, dass diese Räume zu entfernen, bevor Sie den Inhalt des editText holen:

String title = myEditText.getText().toString().substring(8); 

Das bedeutet, ich die 8 Leerzeichen vor dem Wort „Heute“ abgeschnitten.

+0

Können Sie den Downvote erklären ?. Es gibt keine gültige Antwort auf meine Frage, also habe ich eine schnelle Lösung gefunden. – icaneatclouds

2

Sie können animation und frame_layout verwenden, um das linke Symbol zu animieren, versuchen Sie this Link, kann hilfreich für Sie sein.

Verwandte Themen