Android: TextView: ऊपर और नीचे स्पेसिंग और पैडिंग निकालें


208

जब मैं एक है TextViewएक साथ \nपाठ में ,, सही पर मैं दो है singleLine TextViewरों, के बीच में कोई अंतर के साथ अन्य नीचे एक। मैंने तीनों के लिए निम्नलिखित सेट किए हैं TextView

android:lineSpacingMultiplier="1" 
android:lineSpacingExtra="0pt" 
android:paddingTop="0pt" 
android:paddingBottom="0pt"

बाईं ओर की पहली पंक्ति TextViewपूरी तरह से ऊपर दाईं ओर होती है TextView

बाईं ओर TextViewकी दूसरी पंक्ति नीचे दाईं ओर की दूसरी पंक्ति से थोड़ी अधिक है TextView

ऐसा लगता है कि एस के ऊपर और नीचे किसी तरह की छिपी हुई गद्दी है TextView। मैं उसे कैसे हटा सकता हूं?


इस टेक्स्टव्यू के गुरुत्वाकर्षण को केंद्र में रखने की कोशिश करें
Dawid Hy Novy

हाय, जॉर्ज बेली, क्या आपके पास इतने लंबे समय के बाद समाधान है? मैं अब इस समस्या का सामना करता हूं। क्या आप मुझे अपना समाधान दे सकते हैं? धन्यवाद।
mmm2006

1
@ mmm2006, इतने लंबे समय तक मुझे नहीं पता कि मैंने क्या किया। जवाब में समाधान का प्रयास करें। अगर वह काम नहीं करता है, तो एक नया सवाल करें।
ब्रायन फील्ड

यह मेरे लिए काम नहीं किया
मार्टी मिलर

नीचे दिए गए किसी भी उत्तर ने मेरे लिए काम नहीं किया, क्या आप मदद कर सकते हैं
ऋचा

जवाबों:


520
setIncludeFontPadding (boolean includepad)

या XMLइसमें होगा:

android:includeFontPadding="false"

सेट करें कि TextViewसामान्य चढ़ाई और वंश के ऊपर जाने वाले लहजे के लिए जगह बनाने के लिए अतिरिक्त शीर्ष और नीचे पैडिंग शामिल है या नहीं । डिफ़ॉल्ट सत्य है।


3
लेकिन ऐसा लगता है कि हमेशा एक 1dpटॉप / बॉटम पैडिंग होती है, क्या मैं गलत हूं? (मैं उपयोग करता हूं Developer options -> Show layout bounds)
ऑटोबोट्स

94
includeFontPadding="false"अंतरिक्ष में से कुछ को हटा देता है, लेकिन यह सब नहीं। बहुत अजीब।
15

7
यह एक दोधारी तलवार हो सकती है। includeFontPaddingफ़ॉन्ट से किसी भी अतिरिक्त गद्दी को हटाने के लिए महान है, लेकिन यह उन भाषाओं में मुद्दों का कारण बन सकता है जिनमें आरोही और अवरोही हैं। अगर आप ऐसा करते हैं तो मुझे यकीन है कि आप स्पेनिश और थाई जैसी भाषाओं का परीक्षण करेंगे।
इलियट

3
रनटाइम सेट करने के बाद यह शीर्ष पैडिंग नहीं ले रहा है, लेकिन नीचे पैडिंग अभी भी है, यहां तक ​​कि बाएं और दाएं पैडिंग भी? कोई उपाय?
CoDe

5
यह मेरे लिए काम नहीं किया। मुझे समझ नहीं आ रहा है कि मैं क्या याद कर रहा हूँ। मेरे पास अभी भी अवांछित जगह है मेरे TextView के नीचे
मार्टी मिलर

41

मै तुम्हारा दर्द समझ सकता हू। मैंने ऊपर दिए गए हरेक उत्तर setIncludeFontPaddingको झूठ सहित शामिल करने की कोशिश की है , जिसने मेरे लिए कुछ नहीं किया।

मेरा समाधान? layout_marginBottom="-3dp"पर TextViewआप नीचे, BAM के लिए एक समाधान देता है!

हालांकि, -3dp layout_marginTopविफल रहता है .... उह ।


6
यह संभावित रूप से कट ऑफ हो रही पाठ के निचले हिस्से की ओर ले जा सकता है
जेसन रॉबिन्सन

2
नकारात्मक मार्जिन के उपयोग का वास्तव में बुरा विचार। कस्टम दृश्य पर विचार करने के लिए बेहतर है और जैसा आप चाहते हैं वैसा ही पाठ आकर्षित करें।
फ्लायन81

यदि पैच इस तरह है, तो आपको फ़ॉन्ट आकार के अनुपात की भी गणना करनी चाहिए।
phnghue

37

मैंने उचित उत्तर के लिए बहुत कुछ खोजा, लेकिन मुझे ऐसा कोई उत्तर नहीं मिला जहाँ से सभी पैडिंग को पूरी तरह से हटाया जा सके TextView, लेकिन आखिरकार आधिकारिक डॉक्टर के पास जाने के बाद सिंगल लाइन टेक्स के लिए एक काम मिल गया।

android:includeFontPadding="false"
android:lineSpacingExtra="0dp"

इन दोनों लाइनों को TextViewxml में जोड़ने से काम चल जाएगा।
पहला गुण उच्चारण के लिए आरक्षित पैडिंग को हटाता है और दूसरा विशेषता पाठ की दो पंक्तियों के बीच उचित स्थान बनाए रखने के लिए आरक्षित रिक्ति को हटाता है।

सुनिश्चित करें कि lineSpacingExtra="0dp"मल्टीलाइन टेक्स्ट व्यू में न जोड़ें क्योंकि यह उपस्थिति को भद्दा बना सकता है


11
इन दोनों लाइन को जोड़ने से मेरे लिए काम नहीं हो रहा है और साथ ही पैडिंग में कोई बदलाव नहीं आया है
सुनील कुशवाह

@ सुनीलकुशवाह, अगर आप इसे ठीक से कर रहे हैं तो यह निश्चित रूप से काम करेगा। मदद करने में खुशी होगी यदि आप अपनी समस्या के बारे में अधिक जानकारी प्रदान कर सकते हैं।
मोहम्मद आतिफ

@sunilkushwah शायद आप इसे गीथब पर धकेल सकते हैं और लिंक साझा कर सकते हैं
मोहम्मद आतिफ

@sunilkushwah मैं देखता हूं कि आप ब्रैंडन फॉन्ट (कस्टम फॉन्ट) का उपयोग कर रहे हैं। क्या आप एक बार fontPathविशेषता हटाकर प्रयास कर सकते हैं ?
मोहम्मद आतिफ

मैंने यह कोशिश की, लेकिन इसका काम नहीं कर रहा है, ध्यान दें: मैं
TextView

14

यदि आप AppCompatTextView(या API 28आगे से) का उपयोग करते हैं, तो आप पहली पंक्ति पर रिक्ति को हटाने के लिए उन 2 विशेषताओं के संयोजन का उपयोग कर सकते हैं:

एक्सएमएल

android:firstBaselineToTopHeight="0dp"
android:includeFontPadding="false"

Kotlin

text.firstBaselineToTopHeight = 0
text.includeFontPadding = false

11

इससे मुझे भी गुस्सा आया, और मुझे जो जवाब मिला, वह यह था कि फॉन्ट में वास्तव में अतिरिक्त जगह है, टेक्स्टव्यू नहीं। यह बल्कि चिड़चिड़ा है, एक दस्तावेज़ प्रकाशन पृष्ठभूमि से आ रहा है, आपके पास एंड्रॉइड के साथ टाइपोग्राफिक तत्वों पर सीमित मात्रा में नियंत्रण है। मैं एक कस्टम टाइपफेस (जैसे Bitstream Vera Sans, जिसे पुनर्वितरण के लिए लाइसेंस प्राप्त है) का उपयोग करने की सलाह दूंगा, जिसमें यह समस्या नहीं हो सकती है। मुझे विशेष रूप से यकीन नहीं है कि यह करता है या नहीं, हालांकि।


क्या आपके पास मुझे इंगित करने के लिए कुछ मुफ्त फ़ॉन्ट है? मुझे नकारात्मक मार्जिन दिए बिना शीर्ष पर कोई मार्जिन होने की आवश्यकता नहीं है! धन्यवाद!
तिजोरी

11

आप इस विशेषता (ConstraintLayout) का उपयोग करने का प्रयास कर सकते हैं:layout_constraintBaseline_toBaselineOf

ऐशे ही:

एप्लिकेशन: layout_constraintBaseline_toBaselineOf = "@ + id / TextView"

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें


10

मैं अपने कस्टम दृश्य में रिक्ति को हटाता हूं - NoPaddingTextView।

https://github.com/SenhLinsh/NoPaddingTextView

यहां छवि विवरण दर्ज करें

package com.linsh.nopaddingtextview;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.widget.TextView;

/**
 * Created by Senh Linsh on 17/3/27.
 */

public class NoPaddingTextView extends TextView {

    private int mAdditionalPadding;

    public NoPaddingTextView(Context context) {
        super(context);
        init();
    }


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

    private void init() {
        setIncludeFontPadding(false);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int yOff = -mAdditionalPadding / 6;
        canvas.translate(0, yOff);
        super.onDraw(canvas);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        getAdditionalPadding();

        int mode = MeasureSpec.getMode(heightMeasureSpec);
        if (mode != MeasureSpec.EXACTLY) {
            int measureHeight = measureHeight(getText().toString(), widthMeasureSpec);

            int height = measureHeight - mAdditionalPadding;
            height += getPaddingTop() + getPaddingBottom();
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    private int measureHeight(String text, int widthMeasureSpec) {
        float textSize = getTextSize();

        TextView textView = new TextView(getContext());
        textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
        textView.setText(text);
        textView.measure(widthMeasureSpec, 0);
        return textView.getMeasuredHeight();
    }

    private int getAdditionalPadding() {
        float textSize = getTextSize();

        TextView textView = new TextView(getContext());
        textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
        textView.setLines(1);
        textView.measure(0, 0);
        int measuredHeight = textView.getMeasuredHeight();
        if (measuredHeight - textSize > 0) {
            mAdditionalPadding = (int) (measuredHeight - textSize);
            Log.v("NoPaddingTextView", "onMeasure: height=" + measuredHeight + " textSize=" + textSize + " mAdditionalPadding=" + mAdditionalPadding);
        }
        return mAdditionalPadding;
    }
}

यह सवाल है या जवाब?
तुषार

@ तुषार इसका जवाब है।
लीनेश

ठीक। क्या आप कृपया यहाँ कोड के साथ कुछ स्पष्टीकरण जोड़ सकते हैं।
तुषार

@ तुषार ज़रूर, लेकिन यह थोड़ा अधिक है।
लीनेश

3
हालांकि यह कोड प्रश्न को हल कर सकता है, जिसमें यह भी बताया गया है कि यह समस्या कैसे और क्यों हल करती है, वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करेगी (और वोट प्राप्त करें)। याद रखें कि आप भविष्य में पाठकों के लिए सवाल का जवाब दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है! कृपया स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, और इस बात का संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
मकेन

3
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/baselineImage"
        android:includeFontPadding="false" />

    <ImageView
        android:id="@+id/baselineImage"
        android:layout_width="1dp"
        android:layout_height="1dp"
        android:baselineAlignBottom="true"
        android:layout_alignParentBottom="true" />

    <!-- This view will be exactly 10dp below the baseline of textView -->
    <View
        android:id="@+id/view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_below="@+id/baselineImage" />

</RelativeLayout>

एक अतिरिक्त ImageView के साथ हम TextView को ImageView के साथ संरेखित होने वाली आधार रेखा के रूप में सेट कर सकते हैं और ImageView android:baselineAlignBottomको सत्य पर सेट कर सकते हैं, जो नीचे की ओर ImageView की आधार रेखा बना देगा। अन्य दृश्य खुद को ImageView के नीचे का उपयोग करके संरेखित कर सकते हैं जो कि TextView की आधार रेखा के समान है।

हालांकि यह केवल पैडिंग बॉटम को ठीक करता है न कि टॉप को।


मेरी स्थिति के लिए एकदम सही, फ़ॉन्ट पैडिंग को हटाने से बेहतर है। +1
बावा

3

मुझे लगता है कि इस समस्या को इस तरह से हल किया जा सकता है:

 <TextView
        android:id="@+id/leftText"
        android:includeFontPadding="false"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30dp"
        android:text="Hello World!\nhello world" />

 <TextView
        android:id="@+id/rightUpperText"
        android:includeFontPadding="false"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/leftText"
        android:layout_alignTop="@+id/leftText"
        android:textSize="30dp"
        android:text="Hello World!" />

 <TextView
        android:id="@+id/rightLowerText"
        android:includeFontPadding="false"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/leftText"
        android:layout_below="@+id/rightUpperText"
        android:textSize="30dp"
        android:text="hello world" />

वे परिणाम हैं:

स्क्रीनशॉट -1

स्क्रीनशॉट -3

हालाँकि राइटलेवरटेक्स्ट में विशेष वर्णों की लाइन, लेफ्टटेक्स्ट की दूसरी लाइन की तुलना में थोड़ी अधिक है, फिर भी उनकी आधार रेखाएँ अभी भी संरेखित हैं।


शामिल करेंफंडपैडिंग = "गलत" वास्तव में मुझे क्या चाहिए था! धन्यवाद।
hman

3

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

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

यहां छवि विवरण दर्ज करें

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

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

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

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

myTextView.setIncludeFontPadding(false);

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

यहां छवि विवरण दर्ज करें

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

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

अगर मैंने उनमें से एक को हटा दिया तो क्या होगा, इसका उदाहरण दिया गया है।

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

यहां छवि विवरण दर्ज करें

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

यहां छवि विवरण दर्ज करें

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

यहां छवि विवरण दर्ज करें

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

यहां छवि विवरण दर्ज करें



3

नवीनीकृत XML

android:fontFamily="monospace"
android:includeFontPadding="false"

नमस्ते, ढेर अतिप्रवाह में आपका स्वागत है! जब आप किसी प्रश्न का उत्तर देते हैं तो आपको किसी प्रकार का स्पष्टीकरण शामिल करना चाहिए, जैसे कि लेखक ने क्या गलत किया और आपने उसे ठीक करने के लिए क्या किया। मैं आपको यह बता रहा हूं क्योंकि आपके उत्तर को निम्न-गुणवत्ता के रूप में चिह्नित किया गया है और वर्तमान में इसकी समीक्षा की जा रही है। आप "संपादित करें" बटन पर क्लिक करके अपना उत्तर संपादित कर सकते हैं ।
फेडेरिको ग्रैंडे

वास्तव में एंड्रॉइड को बदलना: यदि आपके पास पहले से ही सही फ़ॉन्ट है, तो fontFamily आवश्यक नहीं है। मूल रूप से Android: इसमें शामिल हैं केवल आवश्यक चीज है और यह धागे से पिछले उत्तरों में उल्लेख किया गया है।
डेरेक डोंकिजिक

@DarekDeoniziak कुछ फोंट में रिक्त स्थान हैं
SJJ

2

सरल विधि ने काम किया:

setSingleLine();
setIncludeFontPadding(false);

यदि यह काम नहीं करता है, तो इसे उस कोड से ऊपर जोड़ने का प्रयास करें:

setLineSpacing(0f,0f);
// and set padding and margin to 0

यदि आपको मल्टी लाइन की आवश्यकता है, तो शायद आपको अस्थायी सिंगल लाइन TextView (पहले और बाद में पेडिंग हटाने के माध्यम से) के ऊपर और नीचे पैडिंग की ऊंचाई की गणना करने की आवश्यकता होगी, फिर नकारात्मक पैडिंग या ट्रांसलेशन वाई के साथ कुछ घोस्ट लेआउट के साथ रिड्यूस ऊंचाई परिणाम लागू करें। जबरदस्त हंसी


0

आप दूसरे पाठ दृश्य के निचले भाग को 2 दाएँ पाठ दृश्य के नीचे संरेखित करने का प्रयास कर सकते हैं।


लेकिन तब शीर्ष रेखा ऊपर नहीं जाएगी। और वास्तव में मैं उनके बारे में परवाह नहीं करता हूं, क्योंकि मैं वास्तव में रिक्ति को दूर करना चाहता हूं।
ब्रायन फील्ड

0

मेरे ज्ञान के लिए यह अधिकांश विजेट्स के लिए अंतर्निहित है और "पैडिंग" की मात्रा फोन निर्माताओं के बीच भिन्न है। यह पैडिंग वास्तव में 9 पैच इमेज फाइल में इमेज बॉर्डर और इमेज के बीच की सफेद जगह है।

मेरे Droid X पर उदाहरण के लिए, स्पिनर विजेट्स को बटनों की तुलना में अतिरिक्त सफेद स्थान मिलता है, जो एक बटन के साथ स्पिनर इनलाइन होने पर अजीब लगता है, फिर भी मेरी पत्नी के फोन पर समान एप्लिकेशन को समान समस्या नहीं है और बहुत अच्छा लग रहा है!

मेरा एक ही सुझाव होगा कि आप अपनी 9 पैच फाइलें बनाएं और उन्हें अपने एप्लिकेशन में उपयोग करें।

अहह वेदनाएँ जो Android हैं।

संपादित: स्पष्ट स्थान बनाम सफेद जगह स्पष्ट करें।


0

इस ट्रिक ने मेरे लिए ( min-sdk> = 18 के लिए ) काम किया।

मैं प्रयोग किया जाता android:includeFontPadding="false"है और एक नकारात्मक मार्जिन की तरह android:layout_marginTop="-11dp"है और मेरी डाल TextViewअंदर एक FrameLayout( या किसी ViewGroup ... )

यहां छवि विवरण दर्ज करें

और अंत में नमूना कोड:

<LinearLayout
    android:layout_width="60dp"
    android:layout_height="wrap_content"
    >

    <TextView
        style="@style/MyTextViews.Bold"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/yellow"
        android:textSize="48sp"
        android:layout_marginTop="-11dp"
        android:includeFontPadding="false"
        tools:text="1"/>
</LinearLayout>

1
यह ट्रिक अलग-अलग फ़ॉन्ट, आकार या लेआउट के लिए काम नहीं कर सकती है।
आदिल सूमरो

-1

यह देखो:

क्षैतिज रूप से EditText के साथ ImageView संरेखित करें

ऐसा लगता है कि EditText की पृष्ठभूमि छवि में कुछ पारदर्शी पिक्सेल हैं जो पैडिंग को भी जोड़ते हैं।

एक समाधान EditText की डिफ़ॉल्ट पृष्ठभूमि को कुछ और (या कुछ नहीं, लेकिन EditText के लिए कोई पृष्ठभूमि शायद स्वीकार्य नहीं है) को बदलना है। इसे एंड्रॉइड सेट कर सकते हैं: बैकग्राउंड XML एट्रिब्यूट।

android:background="@drawable/myEditBackground"


-5

अपने ImageView xml में इसका उपयोग करें

एंड्रॉयड: adjustViewBounds = "true"


कृपया इसके बारे में कुछ स्पष्टीकरण जोड़ें
निको हसे

मुझे लगा कि इसे समझना होगा। मैं केवल xml में इस्तेमाल किया जा सकता है।
अंशुल रावत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.