2012-05-26 11 views
20

Mam pionowe LinearLayout z dwoma TextView w środku. Ten pierwszy zawiera nieruchomą właściwość tekstową (tekst nigdy się nie zmienia), a ostatni zawiera zegar regresywny. Obrazek poniżej pokazuje oba elementy:Usuwanie spacji między stosami TextViews

stacked textviews

Chcę wyeliminować spację, że oba teksty zarówno górny i dolny. Próbowałem kilku podejść ...

android:includeFontPadding="false" 
android:lineSpacingMultiplier="1" 
android:lineSpacingExtra="0dp" 
android:paddingTop="0dp" 
android:paddingBottom="0dp" 
android:layout_marginTop="0dp" 
android:layout_marginBottom="0dp" 

... ale żadna z nich nie usunęła przestrzeni nad tekstem. Jak mogę uczynić oba teksty blisko siebie bez dodatkowego miejsca?

PS: Znalazłem this similar question, ale nikt nie odpowiedział.


Pełny kod układ:

<LinearLayout 
    android:id="@+id/boxTime" 
    android:orientation="vertical" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="20dp" > 

    <TextView 
     android:id="@+id/textRemainingTime2" 
     android:layout_width="wrap_content" 
     android:layout_heigh="wrap_content" 
     android:layout_gravity="center" 
     android:gravity="center_horizontal" 
     android:textSize="70sp" 
     android:includeFontPadding="false" 
     android:lineSpacingMultiplier="1" 
     android:lineSpacingExtra="0dp" 
     android:paddingTop="0dp" 
     android:paddingBottom="0dp" 
     android:layout_marginTop="0dp" 
     android:layout_marginBottom="0dp" 
     android:text="@string/title" /> 

    <TextView 
     android:id="@+id/textRemainingTime" 
     android:layout_width="wrap_content" 
     android:layout_heigh="wrap_content" 
     android:layout_gravity="center" 
     android:gravity="center_horizontal" 
     android:includeFontPadding="false" 
     android:lineSpacingMultiplier="1" 
     android:lineSpacingExtra="0dp" 
     android:paddingTop="0dp" 
     android:paddingBottom="0dp" 
     android:layout_marginTop="0dp" 
     android:layout_marginBottom="0dp" 
     android:textSize="107sp" 
     android:text="@string/timer" /> 

</LinearLayout> 
+0

nie próbowałeś ve dopełnienie ?? – Akram

Odpowiedz

40

Spróbuj użyć marginesów ujemnych. Może to zająć trochę zabawy z liczbami, aby to naprawić, ale zrobiłem to już wcześniej i wszystko dobrze się układało.

android:layout_marginTop="-5dp" 
+0

Właściwie używałem tego przez długi czas i nigdy nie miałem problemu, ale wątpię, czy to naprawdę dobre rozwiązanie, ale nie widzę lepszego. –

+0

@PozzoApps To obejście jest więcej niż poprawką, ale działa dobrze, więc ... – Radu

+0

Nadal działa na 4.3 =) –

2

ujemne marże rade

+0

Negatywne dopełnianie nie działa z widokami TextView. –

+0

Edytowałem swoją odpowiedź i usunąłem część dopełniającą –

14

Dokonaj bazową tekstu równym dnie TextView.

public class BaselineTextView extends TextView { 

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

    @Override 
    protected void onDraw(Canvas canvas) { 
     int yOffset = getHeight() - getBaseline(); 
     canvas.translate(0, yOffset); 
     super.onDraw(canvas); 
    } 

} 
+3

Działa to idealnie dla każdej czcionki, rozmiaru czcionki, gęstości ekranu itp. Dlaczego nie jest to zaakceptowana odpowiedź? –

+0

To naprawdę najdogodniejsza odpowiedź dla wszystkich. – tasomaniac

+0

Wszystko to powoduje przesunięcie dopełnienia do górnej części widoku, więc nadal tam jest i musi być uwzględnione w każdym projekcie. –

0

Ujemne marginesy wykonałyby pracę. Można go ustawić na dwa sposoby -

1) poprzez XML - ustaw pole android:Layout_marginTop="-10dp" negatywny

2) przez Java (programowo) - ustawić pole LayoutParams topMargin na negatywną.

0

należy zmienić wysokość TextView i może zmienić android: grawitację = "bottom"

wysokość wynosi od TEXTSIZE i wielkości textView z Wrapcontent.

public class MyTextViewBounder extends TextView { 
public MyTextViewBounder(Context context) { 
    super(context); 
} 

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

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

} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    //test kích thước thực tế với kích thước của Textview bao quanh text của nó như thế nào 
    int width, height; 
    Paint iPaint; 
    Rect iRect = new Rect(); 

    iPaint = new Paint(); 
    iPaint.setTextSize(13); 
    iPaint.setTextAlign(Paint.Align.CENTER); 

    //call below code outsite 
    //this.setText("Hung"); 
    //this.setTextSize(TypedValue.COMPLEX_UNIT_PX,13); 
    //this..setIncludeFontPadding(false); //height from 18px down to 15px 
    iPaint.getTextBounds("Hung",0,4,iRect); //width = 34px, height = 12px 

    width = this.getWidth(); //= 30px 
    height = this.getHeight(); //= 18px 

    width = this.getMeasuredWidth(); //=30px 
    height = this.getMeasuredHeight(); //= 18px 

    width = iRect.width(); //34px 
    height = iRect.height(); //12 px 

} 

}

1

Jeśli ustawisz includeFontPadding false to pomaga.

android:includeFontPadding="false" 

ale jeśli wiesz, że nie mam żadnych zjazdowe, ponieważ można ustawić

android:textAllCaps="true" 

czy wiesz, nie ma żadnych znaków, które mają zjazdowy, można zrobić niestandardową TextView i ustawić wysokość do linia podstawowa.

public class ExTextView extends TextView { 

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

    public ExTextView(Context context, @Nullable AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public ExTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public ExTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     setHeight(getBaseline()); // <--- Shrink size to baseline 
     super.onDraw(canvas); 
    } 
} 

Kod źródłowy jest zawarty w mojej aplikacji testowej UiComponents. https://github.com/landenlabs/UiComponents

0

Ponieważ mój wymóg jest zastąpić istniejący TextView dostać od findViewById(getResources().getIdentifier("xxx", "id", "android"));, więc nie mogę po prostu spróbować onDraw() pozostałych odpowiedzi.

Ale ja po prostu dowiedzieć się odpowiednie kroki w celu stałej mojego problemu, oto efekt końcowy z układu inspektora:

enter image description here

Od czego chciałem się po prostu usunąć z najlepszymi przestrzenie, więc don” t musisz wybrać inną czcionkę, aby usunąć spacje.

Oto kod krytyczny, aby ją naprawiono:

Typeface mfont = Typeface.createFromAsset(getResources().getAssets(), "fonts/myCustomFont.otf"); 
myTextView.setTypeface(mfont); 

myTextView.setPadding(0, 0, 0, 0); 

myTextView.setIncludeFontPadding(false); 

Pierwszy klucz jest ustawiony niestandardowy czcionki można „fonts/myCustomFont.otf”, który ma miejsce na dole, ale nie na górze, łatwo figura poza tym, otwartego pliku OTF i kliknij dowolną czcionkę w android Studio:

enter image description here

Jak widać, kursor na dole ma dodatkowe odstępy, ale nie na górze, więc to ustalone mój problem.

Drugi klucz to nie można po prostu pominąć żadnego kodu, w przeciwnym razie może nie działać. Z tego powodu niektórzy ludzie mogą powiedzieć, że odpowiedź działa, a niektórzy komentują, że nie działa.

Zilustrowaliśmy, co się stanie, jeśli usunę jedną z nich.

bez setTypeface(mfont);:

enter image description here

bez setPadding(0, 0, 0, 0);:

enter image description here

bez setIncludeFontPadding(false);:

enter image description here

Bez 3 z nich (tj. oryginalna):

enter image description here

Powiązane problemy