Android: TextView: ลบระยะห่างและช่องว่างภายในด้านบนและด้านล่าง


208

เมื่อฉันมีTextViewกับ\nในข้อความ ,, ด้านขวาฉันมีสองsingleLine TextViews หนึ่งดังต่อไปนี้ไม่มีอื่น ๆ ที่มีระยะห่างระหว่าง ฉันได้ตั้งค่าต่อไปนี้สำหรับทั้งสามTextViews

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

บรรทัดแรกของด้านซ้ายเส้นขึ้นอย่างสมบูรณ์แบบด้วยขวาบนTextViewTextView

บรรทัดที่สองของด้านซ้ายTextViewสูงกว่าบรรทัดที่สองของด้านล่างขวาTextViewเล็กน้อย

มันดูเหมือนว่ามีบางชนิดของการขยายซ่อนอยู่ด้านบนและด้านล่างของTextViews ฉันจะลบออกได้อย่างไร


พยายามกำหนดแรงโน้มถ่วงของมุมมองข้อความนี้เป็น center_vertical
Dawid Hyży

สวัสดีจอร์จเบลีย์คุณมีทางออกหลังจากผ่านไปนานไหม? ฉันพบปัญหานี้ด้วยตอนนี้ คุณช่วยแก้ปัญหาให้ฉันได้ไหม ขอบคุณ
mmm2006

1
@ mmm2006 มานานแล้วฉันไม่รู้ว่าฉันทำอะไรลงไป ลองวิธีแก้ปัญหาในคำตอบ หากยังไม่ได้ผลให้ตั้งคำถามใหม่
ไบรอันฟิลด์

สิ่งนี้ไม่ได้ผลสำหรับฉัน
Marty Miller

ใด ๆ ดังต่อไปนี้ตอบไม่ได้ทำงานสำหรับฉันคุณสามารถช่วยเหลือ
Richa

คำตอบ:


520
setIncludeFontPadding (boolean includepad)

หรือในXMLนี้จะเป็น:

android:includeFontPadding="false"

กำหนดว่าจะให้TextViewมีส่วนเสริมพิเศษและส่วนเสริมด้านล่างเพื่อให้มีที่ว่างสำหรับสำเนียงที่อยู่เหนือระดับปกติและขึ้นหรือลง ค่าเริ่มต้นเป็นจริง


3
แต่ดูเหมือนว่าจะมี1dpช่องว่างภายใน / ล่างฉันผิดหรือเปล่า (ฉันใช้Developer options -> Show layout bounds)
บอทส์

94
includeFontPadding="false"จะลบบางส่วนของพื้นที่ แต่ไม่ใช่ทั้งหมด ที่แปลกมาก.
theblang

7
นี่อาจเป็นดาบสองคม includeFontPaddingเหมาะอย่างยิ่งสำหรับการลบการขยายเพิ่มเติมใด ๆ ออกจากตัวอักษร แต่สามารถทำให้เกิดปัญหาในภาษาที่มีการขึ้นและลง ฉันจะตรวจสอบให้แน่ใจว่าคุณทำแบบทดสอบภาษาสเปนและไทยถ้าคุณสนับสนุนพวกเขา
เอลเลียต

3
หลังจากตั้งค่ารันไทม์แล้วมันไม่ได้ใช้การแพ็ดด้านบน แต่การบุรองด้านล่างยังคงอยู่ที่นั่นแม้จะเว้นระยะห่างและขวา ข้อเสนอแนะใด ๆ
CoDe

5
สิ่งนี้ไม่ได้ผลสำหรับฉัน ฉันไม่เข้าใจสิ่งที่ฉันหายไป ฉันยังมีพื้นที่ที่ไม่ต้องการที่ด้านล่างของ TextView ของฉัน
Marty Miller

41

ฉันรู้สึกถึงความเจ็บปวดของคุณ. ฉันลองทุกคำตอบข้างต้นรวมถึงsetIncludeFontPaddingที่ไม่ได้ทำอะไรเลย

ทางออกของฉัน? layout_marginBottom="-3dp"บนTextViewช่วยให้คุณแก้ปัญหาด้านล่าง, BAM เป็นคนแรก!

แม้ว่า -3dp จะlayout_marginTopล้มเหลว .... ฮึ


6
สิ่งนี้สามารถนำไปสู่ด้านล่างของข้อความที่อาจถูกตัดออก
Jason Robinson

2
ความคิดที่ไม่ดีจริงๆของการใช้มาร์จิ้นติดลบ ดีกว่าที่จะพิจารณามุมมองที่กำหนดเองและวาดข้อความตรงตามที่คุณต้องการ
Flynn81

หากแพทช์เช่นนี้คุณควรคำนวณอัตราส่วนของขนาดตัวอักษรด้วย
phnghue

37

ฉันค้นหาคำตอบที่เหมาะสมมาก แต่ไม่มีที่ไหนที่ฉันสามารถหาคำตอบที่สามารถลบการขยายออกทั้งหมดTextViewแต่ในที่สุดหลังจากผ่านเอกสารอย่างเป็นทางการได้ทำงานรอบ ๆ สำหรับข้อความบรรทัดเดียว

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

การเพิ่มสองบรรทัดเหล่านี้ไปยังTextViewxml จะทำงานได้
แอตทริบิวต์แรกจะลบการเว้นวรรคที่สงวนไว้สำหรับเครื่องหมายเน้นเสียงและแอตทริบิวต์ที่สองจะลบการเว้นวรรคที่สงวนไว้เพื่อรักษาพื้นที่ที่เหมาะสมระหว่างข้อความสองบรรทัด

ตรวจสอบให้แน่ใจว่าไม่ได้เพิ่มlineSpacingExtra="0dp"ในหลาย TextView เพราะอาจทำให้รูปลักษณ์ดูเงอะงะ


11
การเพิ่มสองบรรทัดนี้ไม่ได้ผลสำหรับฉันและยังไม่มีการเปลี่ยนแปลงในการ
แพ็ด

@Sunilkushwah แน่นอนว่ามันจะทำงานถ้าคุณทำอย่างถูกต้อง ยินดีที่จะช่วยเหลือหากคุณสามารถให้รายละเอียดเพิ่มเติมเกี่ยวกับปัญหาของคุณ
Mohammed Atif

@sunilkushwah คุณอาจกดที่ github และแชร์ลิงก์
Mohammed Atif

@sunilkushwah ฉันเห็นว่าคุณกำลังใช้แบบอักษรแบรนดอน (แบบอักษรที่กำหนดเอง) คุณสามารถลองลบfontPathแอตทริบิวต์ได้ไหม?
Mohammed Atif

ฉันลองสิ่งนี้ แต่มันใช้งานไม่ได้หมายเหตุ: ฉันไม่ต้องการให้ช่องว่างภายในเริ่มต้นใน TextView
sunil kushwah

14

ถ้าคุณใช้AppCompatTextView(หรือจากAPI 28เป็นต้นไป) คุณสามารถใช้การรวมกันของทั้งสองคุณลักษณะเพื่อลบช่องว่างในบรรทัดแรก:

XML

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

Kotlin

text.firstBaselineToTopHeight = 0
text.includeFontPadding = false

11

สิ่งนี้ทำให้ฉันรำคาญเช่นกันและคำตอบที่ฉันพบคือว่ามีพื้นที่เพิ่มเติมในแบบอักษรไม่ใช่ TextView มันค่อนข้างน่ารำคาญที่มาจากพื้นหลังการเผยแพร่เอกสารจำนวน จำกัด ของการควบคุมที่คุณมีกับ Android มากกว่าองค์ประกอบการพิมพ์ ฉันขอแนะนำให้ใช้แบบอักษรที่กำหนดเอง (เช่น 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;
    }
}

คำถามนี้หรือคำตอบ?
Tushar

@Tushar มันเป็นคำตอบ
Linsh

ตกลง. คุณช่วยเพิ่มคำอธิบายด้วยรหัสที่นี่ได้ไหม
Tushar

@Tushar แน่นอน แต่มันเพิ่มเติมอีกหน่อย
Linsh

3
แม้ว่ารหัสนี้อาจแก้ปัญหาได้รวมถึงคำอธิบายว่าทำไมและวิธีแก้ปัญหานี้จะช่วยปรับปรุงคุณภาพการโพสต์ของคุณได้อย่างไร (และได้รับคะแนนมากขึ้น) โปรดจำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตไม่ใช่เพียงแค่คนที่ถามตอนนี้! โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายและระบุข้อ จำกัด และสมมติฐานที่ใช้
Makyen

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 และตั้งandroid:baselineAlignBottomบน ImageView ให้เป็นจริงซึ่งจะทำให้พื้นฐานของ ImageView ไปด้านล่าง มุมมองอื่น ๆ สามารถจัดแนวตัวเองโดยใช้ด้านล่างของ ImageView ซึ่งตัวเองเป็นเช่นเดียวกับพื้นฐานของ TextView

อย่างไรก็ตามสิ่งนี้จะแก้ไขด้านล่างของช่องว่างภายในไม่ใช่ด้านบน


สมบูรณ์แบบสำหรับสถานการณ์ของฉันวิธีที่ดีกว่าการลบการขยายแบบอักษร +1
Bawa

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

แม้ว่าบรรทัดของอักขระพิเศษใน rightLowerText ดูเหมือนจะสูงกว่าเล็กน้อยบรรทัดที่สองของ leftText แต่เส้นเขตแดนของพวกเขาจะยังคงอยู่ในแนวเดียวกัน


includeFontPadding = "false" เป็นสิ่งที่ฉันต้องการ! ขอบคุณ
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);

กุญแจแรกคือการตั้งค่าแบบอักษรที่กำหนดเอง "fonts / myCustomFont.otf" ซึ่งมีพื้นที่ด้านล่าง แต่ไม่อยู่ด้านบนคุณสามารถเข้าใจได้โดยเปิดไฟล์ otf และคลิกแบบอักษรใด ๆ ใน android Studio:

ป้อนคำอธิบายรูปภาพที่นี่

อย่างที่คุณเห็นเคอร์เซอร์ด้านล่างมีระยะห่างพิเศษ แต่ไม่ใช่ที่ด้านบนดังนั้นจึงแก้ไขปัญหาของฉันได้

กุญแจดอกที่สองคือคุณไม่สามารถข้ามรหัสใด ๆ ได้เลยมิฉะนั้นอาจใช้งานไม่ได้ นั่นคือเหตุผลที่คุณพบว่าบางคนแสดงความคิดเห็นว่าคำตอบนั้นใช้ได้และคนอื่น ๆ แสดงความคิดเห็นว่ามันไม่ทำงาน

มาอธิบายกันว่าจะเกิดอะไรขึ้นถ้าฉันลบอันใดอันหนึ่งออก

โดยไม่ต้องsetTypeface(mfont);:

ป้อนคำอธิบายรูปภาพที่นี่

โดยไม่ต้องsetPadding(0, 0, 0, 0);:

ป้อนคำอธิบายรูปภาพที่นี่

โดยไม่ต้องsetIncludeFontPadding(false);:

ป้อนคำอธิบายรูปภาพที่นี่

ไม่รวม 3 รายการ (เช่นต้นฉบับ):

ป้อนคำอธิบายรูปภาพที่นี่



3

อัปเดต XML

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

สวัสดียินดีต้อนรับสู่ Stack Overflow! เมื่อคุณตอบคำถามคุณควรมีคำอธิบายบางอย่างเช่นสิ่งที่ผู้เขียนทำผิดและสิ่งที่คุณทำเพื่อแก้ไข ฉันกำลังบอกคุณเพราะคำตอบของคุณถูกตั้งค่าสถานะว่ามีคุณภาพต่ำและกำลังได้รับการตรวจสอบ คุณสามารถแก้ไขคำตอบได้โดยคลิกที่ปุ่ม "แก้ไข"
Federico Grandi

การเปลี่ยน Android จริง: fontFamily ไม่จำเป็นถ้าคุณมีแบบอักษรที่ถูกต้องแล้ว Android พื้นฐาน: includeFontPadding เป็นสิ่งเดียวที่จำเป็นและได้รับการกล่าวถึงในคำตอบก่อนหน้าจากเธรด
Darek Deoniziak

@DarekDeoniziak แบบอักษรบางตัวมีช่องว่าง
SJJ

2

วิธีการทำงานง่าย ๆ :

setSingleLine();
setIncludeFontPadding(false);

หากยังใช้งานไม่ได้ให้ลองเพิ่มโค้ดข้างต้นนี้:

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

หากคุณต้องการหลายบรรทัดคุณอาจจำเป็นต้องคำนวณความสูงของการเติมด้านบนและด้านล่างอย่างแม่นยำผ่าน TextView บรรทัดเดียว TextView (ก่อนและหลังการลบการแพ็ดดิ้ง) จากนั้นจึงใช้ผลการลดความสูงด้วยการแพ็ดเชิงลบ ฮ่า ๆ


0

คุณอาจต้องการลองจัดแนวด้านล่างของมุมมองข้อความด้านซ้ายกับด้านล่างของมุมมองข้อความด้านขวา 2


แต่จากนั้นบรรทัดบนสุดจะไม่เข้าแถว และจริง ๆ แล้วฉันไม่สนใจพวกเขาเรียงแถวเท่าที่ฉันต้องการลบระยะห่าง
สนามไบรอัน

0

ตามความรู้ของฉันสิ่งนี้มีอยู่ในวิดเจ็ตส่วนใหญ่และจำนวนของ "ช่องว่างภายใน" แตกต่างจากผู้ผลิตโทรศัพท์ ช่องว่างภายในนี้เป็นช่องว่างระหว่างขอบภาพและภาพในไฟล์อิมเมจ 9 ไฟล์

ตัวอย่างเช่นใน Droid X ของฉันวิดเจ็ตสปินเนอร์จะได้พื้นที่สีขาวมากกว่าปุ่มซึ่งทำให้มันดูงุ่มง่ามเมื่อคุณมีอินไลน์สปินเนอร์ด้วยปุ่ม แต่บนโทรศัพท์ของภรรยาแอปพลิเคชันเดียวกันไม่มีปัญหาเดียวกัน

คำแนะนำเดียวที่ฉันมีก็คือการสร้างไฟล์ปะแก้ 9 ไฟล์ของคุณเองและใช้มันในแอปพลิเคชันของคุณ

Ahhh ความเจ็บปวดที่เป็น Android

แก้ไข: ชี้แจงช่องว่างภายใน vs พื้นที่สีขาว


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
เคล็ดลับนี้อาจไม่ทำงานกับแบบอักษรขนาดหรือเค้าโครงที่แตกต่างกัน
Adil Soomro

-1

ดูนี่:

จัดแนว ImageView ด้วย EditText ในแนวนอน

ดูเหมือนว่าภาพพื้นหลังของ EditText จะมีพิกเซลแบบโปร่งใสบางส่วนซึ่งเพิ่มการขยายตัว

วิธีแก้ไขคือการเปลี่ยนพื้นหลังเริ่มต้นของ EditText เป็นอย่างอื่น (หรือไม่มีอะไรเลย แต่ไม่มีพื้นหลังสำหรับ EditText ที่อาจไม่เป็นที่ยอมรับ) สามารถทำการตั้งค่า android: คุณลักษณะ XML พื้นหลังได้

android:background="@drawable/myEditBackground"


-5

ใช้สิ่งนี้ใน ImageView xml ของคุณ

หุ่นยนต์: adjustViewBounds = "true"


โปรดเพิ่มคำอธิบายบางอย่างเกี่ยวกับสิ่งนั้น
Nico Haase

ฉันคิดว่าสิ่งนี้จะต้องเข้าใจ ฉันสามารถใช้ได้เฉพาะใน xml
Anshul Rawat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.