Bry*_*eld 181 android padding spacing textview
当我在文本中有a TextView
时\n
,在右边我有两个singleLine
TextView
s,一个在另一个之下,两者之间没有间距.我为所有三个人设置了以下内容TextView
.
android:lineSpacingMultiplier="1"
android:lineSpacingExtra="0pt"
android:paddingTop="0pt"
android:paddingBottom="0pt"
Run Code Online (Sandbox Code Playgroud)
左边的第一行TextView
与右上角完美排列TextView
.
左边TextView
的第二行略高于右下角的第二行TextView
.
似乎在TextView
s 的顶部和底部有某种隐藏的填充.我怎么能删除它?
use*_*545 469
setIncludeFontPadding (boolean includepad)
Run Code Online (Sandbox Code Playgroud)
或者在XML
这将是:
android:includeFontPadding="false"
Run Code Online (Sandbox Code Playgroud)
设置是否TextView
包括额外的顶部和底部填充,以便为超出正常上升和下降的重音腾出空间.默认值为true.
hun*_*erp 39
我感觉到你的痛苦.我已经尝试过上面的每一个答案,包括setIncludeFontPadding
假的,这对我没有任何帮助.
我的解决方案 layout_marginBottom="-3dp"
在这TextView
给你一个底部的解决方案,BAM!
虽然,-3dp layout_marginTop
失败了......呃.
Moh*_*tif 34
我搜索了很多正确的答案,但没有找到一个可以完全删除所有填充的答案TextView
,但最后经过官方文档得到了单行文本的解决方法
android:includeFontPadding="false"
android:lineSpacingExtra="0dp"
Run Code Online (Sandbox Code Playgroud)
将这两行添加到TextView
xml将完成工作.
第一个属性删除为重音项保留的填充,第二个属性删除保留的空格以保持两行文本之间的适当空格.
确保不要添加
lineSpacingExtra="0dp"
多行TextView,因为它可能会使外观变得笨拙
小智 17
更新的 XML
android:fontFamily="monospace"
android:includeFontPadding="false"
Run Code Online (Sandbox Code Playgroud)
kco*_*ock 10
这也让我恼火,我找到的答案是字体本身实际上有额外的空间,而不是TextView.从文档发布背景来看,这是相当令人恼火的,你对Android的印刷元素控制有限.我建议使用可能没有此问题的自定义字体(例如Bitstream Vera Sans,其被许可用于再分发).不过,我不确定具体是否确实如此.
我删除了自定义视图中的间距-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;
}
}
Run Code Online (Sandbox Code Playgroud)
由于我的要求是覆盖从 获取的现有 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);
Run Code Online (Sandbox Code Playgroud)
第一个键是设置自定义字体“fonts/myCustomFont.otf”,它的底部有空格但顶部没有,您可以通过打开 otf 文件并单击 android Studio 中的任何字体轻松找出这一点:
正如您所看到的,底部的光标有额外的间距,但顶部没有,所以它解决了我的问题。
The second key is you can't simply skip any of the code, otherwise it might not works. That's the reason you can found some people comment that an answer is working and some other people comment that it's not working.
Let's illustrated what will happen if I remove one of them.
Without setTypeface(mfont);
:
Without setPadding(0, 0, 0, 0);
:
Without setIncludeFontPadding(false);
:
Without 3 of them (i.e. the original):
小智 6
您可以尝试使用此属性(ConstraintLayout):layout_constraintBaseline_toBaselineOf
像这样:
app:layout_constraintBaseline_toBaselineOf =“ @ + id / textView”
<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>
Run Code Online (Sandbox Code Playgroud)
通过额外的 ImageView,我们可以将 TextView 设置为与 ImageView 的基线对齐,并将android:baselineAlignBottom
ImageView 上的 设为 true,这将使 ImageView 的基线位于底部。其他视图可以使用 ImageView 的底部自行对齐,该底部本身与 TextView 的基线相同。
然而,这仅修复了填充底部而不是顶部。
如果使用AppCompatTextView
(或从API 28
向前),则可以使用这两个属性的组合来删除第一行的间距:
XML格式
android:firstBaselineToTopHeight="0dp"
android:includeFontPadding="false"
Run Code Online (Sandbox Code Playgroud)
科特林
text.firstBaselineToTopHeight = 0
text.includeFontPadding = false
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
136715 次 |
最近记录: |