2012-05-26 14 views
20

Ho un LinearLayout verticale con due TextView al suo interno. Il primo contiene una proprietà di testo statico (il testo non cambia mai) e l'ultimo contiene un timer regressivo. L'immagine sotto mostra entrambe le voci:Rimuovere lo spazio tra TextViews impilati

stacked textviews

voglio eliminare lo spazio vuoto che entrambi i testi hanno sia alto e in basso. Ho provato diversi approcci ...

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

... ma nessuno di essi ha rimosso lo spazio sopra il testo. Come posso rendere entrambi i testi vicini l'uno all'altro senza spazio extra?

PS: ho trovato this similar question, ma nessuno ha risposto.


codice del layout completi:

<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

hai provato imbottitura ve ?? – Akram

risposta

40

Prova con margini negativi. Potrebbe essere necessario giocare un po 'con i numeri per farlo bene, ma l'ho già fatto e ha funzionato bene.

android:layout_marginTop="-5dp" 
+0

In realtà l'ho usato per molto tempo e non ho mai avuto problemi, ma continuo a dubitare che questa sia davvero una buona soluzione, ma non riesco a vederne una migliore. –

+0

@PozzoApps È una soluzione più che una correzione, ma funziona bene, quindi ... – Radu

+0

funziona ancora su 4.3 =) –

2

margini negativi farà il trucco

+0

Il riempimento negativo non funziona con TextViews. –

+0

Ho modificato la mia risposta e rimosso la parte del padding –

14

Marchio di base del testo uguale alla parte inferiore della 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

Ciò funziona perfettamente per qualsiasi carattere, dimensione del carattere, densità dello schermo, ecc. Perché non è la risposta accettata? –

+0

Questa è davvero la risposta più conveniente di tutte. – tasomaniac

+0

Tutto ciò sposta il padding nella parte superiore della vista, quindi è ancora lì e deve essere tenuto in considerazione in qualsiasi lavoro di progettazione. –

0

Margini negativi farebbero il lavoro. È possibile impostare in due modi -

1) di XML - impostare il campo android:Layout_marginTop="-10dp" negativo

2) da Java (livello di programmazione) - impostare il campo di LayoutParams topMargin a negativo.

0

si dovrebbe modificare l'altezza di TextView e forse cambiare Android: la gravità = "bottom"

altezza è compresa tra TEXTSIZE e le dimensioni delle textView con 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

Se si imposta includeFontPadding false aiuta.

android:includeFontPadding="false" 

ma se sai che non si dispone di alcun discendenti perché si imposta

android:textAllCaps="true" 

o se si sa non ci sono personaggi che hanno discensore, è possibile effettuare una TextView personalizzato e impostare l'altezza a la linea di base.

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); 
    } 
} 

Il codice sorgente è incluso nella mia app di test UiComponents. https://github.com/landenlabs/UiComponents

0

Dal momento che la mia richiesta è ignorare l'esistente textView ottenere da findViewById(getResources().getIdentifier("xxx", "id", "android"));, quindi non posso semplicemente provare onDraw() di altra risposta.

Ma ho solo capire i passaggi corretti per fisso il mio problema, qui è il risultato finale da Impostazioni Layout:

enter image description here

Da quello che volevo è semplicemente rimuovere gli spazi migliori, così ho don' t devo scegliere un altro font per rimuovere gli spazi inferiori.

Ecco il codice fondamentale per fixed it:

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

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

myTextView.setIncludeFontPadding(false); 

La prima chiave è impostata carattere personalizzato "fonts/myCustomFont.otf", che ha lo spazio sul fondo, ma non sulla parte superiore, si può facilmente figura questo per file sistema organizzato di negoziazione aperta e fare clic su qualsiasi tipo di carattere in Android Studio:

enter image description here

Come si può vedere, il cursore nella parte inferiore ha la spaziatura in più, ma non sulla parte superiore, in modo che risolto il mio problema.

Il secondo tasto è non è possibile saltare semplicemente uno qualsiasi del codice, altrimenti potrebbe non funzionare. Questo è il motivo per cui alcune persone possono commentare che una risposta sta funzionando e alcune altre persone commentano che non funziona.

Illustriamo cosa accadrà se rimuoverò uno di essi.

Senza setTypeface(mfont);:

enter image description here

Senza setPadding(0, 0, 0, 0);:

enter image description here

Senza setIncludeFontPadding(false);:

enter image description here

Senza 3 di essi (ad es. l'originale):

enter image description here

Problemi correlati