2012-05-26 16 views
20

के बीच स्थान निकालें मेरे पास दो TextView के साथ एक लंबवत LinearLayout है। पूर्व में एक स्थिर पाठ संपत्ति होती है (यह पाठ कभी नहीं बदलता) और आखिरी में एक प्रतिगमन टाइमर होता है। नीचे दी गई छवि दोनों आइटम दिखाता है:स्टैक्ड टेक्स्ट व्यू

stacked textviews

मैं रिक्त स्थान है कि दोनों ग्रंथों दोनों ऊपर और नीचे है को खत्म करना चाहते हैं। मैंने कई दृष्टिकोणों की कोशिश की है ...

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

... लेकिन उनमें से कोई भी पाठ के ऊपर की जगह को हटा नहीं पाया। मैं बिना किसी अतिरिक्त स्थान के दोनों ग्रंथों को एक-दूसरे के करीब कैसे बना सकता हूं?

पीएस: मुझे this similar question मिला है, लेकिन किसी ने इसका उत्तर नहीं दिया।


पूर्ण लेआउट कोड:

<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

आप -ve गद्दी की कोशिश की किया ?? – Akram

उत्तर

40

नकारात्मक हाशिए का उपयोग करें। इसे सही करने के लिए संख्याओं के साथ खेलना थोड़ा सा हो सकता है, लेकिन मैंने इसे पहले किया है और यह अच्छी तरह से काम करता है।

android:layout_marginTop="-5dp" 
+0

असल में मैंने इसे लंबे समय तक इस्तेमाल किया था और कभी भी कोई समस्या नहीं आई, लेकिन मुझे संदेह है कि यह वास्तव में एक अच्छा समाधान है, लेकिन मैं बेहतर नहीं देख सकता। –

+0

@PozzoApps यह एक फिक्स से अधिक कामकाज है, लेकिन यह अच्छी तरह से काम करता है, इसलिए ... – Radu

+0

अभी भी 4.3 =) –

2

नकारात्मक हाशिए चाल पाठ TextView के नीचे करने के लिए बराबर की

+0

पर काम करता है नकारात्मक पैडिंग टेक्स्ट व्यू के साथ काम नहीं करता है। –

+0

मैंने अपना जवाब संपादित कर लिया है और पैडिंग भाग –

14

मेक आधारभूत करेंगे।

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

हटा दिया है यह किसी भी फ़ॉन्ट, फ़ॉन्ट आकार, स्क्रीन घनत्व आदि के लिए पूरी तरह से काम करता है। यह स्वीकार्य उत्तर क्यों नहीं है? –

+0

यह वास्तव में सभी का सबसे सुविधाजनक उत्तर है। – tasomaniac

+0

यह सब पैडिंग को दृश्य के शीर्ष पर ले जाता है, इसलिए यह अभी भी वहां है और किसी भी डिज़ाइन कार्य में इसके लिए जिम्मेदार होना है। –

0

नकारात्मक मार्जिन काम करेगा।

1) एक्सएमएल द्वारा - - आप दो तरीकों से सेट कर सकते हैं जावा द्वारा android:Layout_marginTop="-10dp" क्षेत्र नकारात्मक

2) सेट (प्रोग्राम) - नकारात्मक करने के लिए LayoutParams की topMargin क्षेत्र निर्धारित किया है।

11

डिफ़ॉल्ट रूप से, TextView includes some padding to leave space for accent characters। आपको लगता है कि बंद कर सकते हैं साथ:

android:includeFontPadding="false" 

या

textView.setIncludeFontPadding(false) 
+1

यह मेरे लिए काम करता है। लेकिन अभी भी कुछ जगह आरोही में है और टेक्स्ट को अवरुद्ध करने के लिए इसे कैसे निकाला जा सकता है? –

0

आप TextView की ऊंचाई बदलना चाहिए और शायद बदल एंड्रॉयड: गुरुत्वाकर्षण = "नीचे"

ऊंचाई textsize और के आकार के बीच है Wrapcontent के साथ textView।

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

आप झूठी यह मदद करता है करने के लिए includeFontPadding सेट करते हैं।

android:includeFontPadding="false" 

लेकिन अगर आप जानते हैं कि आप किसी भी descenders की जरूरत नहीं है क्योंकि आप

android:textAllCaps="true" 

सेट या आप जानते हैं कि वहाँ जो descender है कोई चरित्र, आप एक कस्टम TextView बनाने के लिए और करने के लिए ऊंचाई सेट कर सकते हैं आधार रेखा

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

स्रोत कोड मेरे यूआईकंपोनेंट्स टेस्ट ऐप में शामिल है। https://github.com/landenlabs/UiComponents

0

के बाद से मेरी आवश्यकता ओवरराइड है मौजूदा findViewById(getResources().getIdentifier("xxx", "id", "android")); से प्राप्त TextView, तो मैं बस अन्य जवाब का onDraw() कोशिश नहीं कर सकते।

लेकिन मैं सिर्फ अपनी समस्या तय करने के लिए सही चरणों यह पता लगाने के लिए, यहाँ लेआउट इंस्पेक्टर से अंतिम परिणाम है:

enter image description here

मैं चाहता था केवल शीर्ष रिक्त स्थान को दूर किया जाता है, तो मैं डॉन ' टी को नीचे की जगहों को हटाने के लिए अन्य फ़ॉन्ट चुनना होगा।

यहाँ महत्वपूर्ण कोड यह तय करने के लिए है:

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

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

myTextView.setIncludeFontPadding(false); 

पहले कुंजी सेट किया गया है कस्टम फ़ॉन्ट "फोंट/myCustomFont.otf" जो तल पर लेकिन शीर्ष पर नहीं की जगह है, तो आप आसानी आंकड़ा खुला otf फ़ाइल द्वारा इस बाहर और एंड्रॉयड स्टूडियो में किसी भी फ़ॉन्ट क्लिक करें:

enter image description here

आप देख सकते हैं, तल पर कर्सर अतिरिक्त रिक्ति है, लेकिन शीर्ष पर नहीं है, इसलिए यह मेरी समस्या तय की।

दूसरी कुंजी है, आप बस कोड को छोड़ नहीं सकते हैं, अन्यथा यह काम नहीं कर सकता है। यही कारण है कि आप कुछ लोगों को टिप्पणी कर सकते हैं कि एक जवाब काम कर रहा है और कुछ अन्य लोग टिप्पणी करते हैं कि यह काम नहीं कर रहा है।

आइए बताएं कि क्या होगा यदि मैं उनमें से एक को हटा दूं।

setTypeface(mfont); के बिना:

enter image description here

setPadding(0, 0, 0, 0); के बिना:

enter image description here

setIncludeFontPadding(false); के बिना:

enter image description here

उनमें से 3 के बिना (यानी। मूल):

enter image description here

संबंधित मुद्दे