在Android中将大文本居中放置在按钮内无法正常工作

3

我需要将一个大数字居中显示在一个 Button 中,但它总是向下偏移。请参考以下图片:

enter image description here

我的 activity_main.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button
        android:textSize="490sp"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center_vertical"
        android:gravity="center"
        android:textAlignment="center"
        android:includeFontPadding="false"
        android:text="8" />
</LinearLayout>    

如果我设置一些较小的文本大小 - 它会正确居中。 此外,如果我使用带有android:scaleType="center"的ImageButton,则图像完美地居中。但我需要居中文本。
请问您能否帮忙解决这个问题?
毫无疑问,这是一个Android的bug。可能存在某些类或解决方法。

请显示完整布局。您的按钮受父元素的约束,不能变得足够高以适应文本。要么更改父元素以允许更大的子元素,要么减小文本大小。 - Francesc
我尝试了不同的布局,但是当文本较大时,它总是向下偏移。您可以创建一个新的简单项目,并尝试在按钮内放置一些大文本。使用TextView也会出现同样的问题。可能需要实现一些特殊的类来进行居中处理,但是在哪里找到呢? - ViH
这不是完整的布局,你的LinearLayout可能仍然受到其父级的限制。请发布完整的XML布局。 - Francesc
1
我认为fill_parent会出现问题。你能试试将按钮的宽度和高度设置为wrap_content吗?<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="8" android:textSize="80sp" /> - Vivart
Vivart,我已经尝试了 - 没有任何变化。Francesc,请看,我已经更新了我的帖子。这只是一个带有一个按钮的空白项目。 - ViH
1
我建议做450sp。 - Aditya Vyas-Lakhan
5个回答

1
<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

   <Button 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:gravity="center" 
        android:text="8" 
        android:textSize="80sp" />

所以你在底部和线性布局中使用了fill_parent作为参数,我猜可能会发生的情况是它没有足够的空间来放置线性布局和按钮,使用wrap_content可以让底部适应文本,而不是依赖于布局的权重和高度。

***** 更新 **

我看到你已经添加了

android:includeFontPadding="false"

如果你真的想要去除空格,试着添加

android:layout_marginTop="-100dp"

将其添加到您的按钮参数中。

OPпјҢиҜ·зңӢиҝҷйҮҢгҖӮеҰӮжһңдҪ еҸӘе…іеҝғй«ҳеәҰпјҢдҪ еҸҜиғҪеҸӘйңҖиҰҒеңЁй«ҳеәҰдёҠдҪҝз”Ёwrap_contentгҖӮж— и®әе“Әз§Қж–№ејҸпјҢеҰӮжһңдҪ ж„ҝж„ҸпјҢдҪ еҸҜд»Ҙж·»еҠ дёҖдәӣеЎ«е……жқҘз»ҷеҶ…е®№з•ҷеҮәиҫ№зјҳз©әй—ҙгҖӮ - Sammy T
没有改变 - 仍然向下偏移。总是有一些字体填充。但如何摆脱它。 - ViH
好的。布局本身不应该给你任何额外的填充/边距。它必须是包含它的任何布局。您能否编辑原始帖子以包括您的应用程序容器布局(工具栏/应用栏,引用此布局的任何布局等)? - Sammy T

0

有一个技巧可以实现这个:将Button放在一个FrameLayout中,并使用负边距来使Button居中,如您所需:

<FrameLayout
    android:layout_width="41dp"
    android:layout_height="41dp">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:layout_marginTop="-7dp"
        android:text="8"
        android:textSize="40dp"/>
</FrameLayout>

你会发现 8FrameLayout 的范围内居中显示。我已经在多个API上测试了这种方法,每个文本都保持居中。


0

试试这个:

<Button
    android:textSize="80sp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:includeFontPadding="false"
    android:text="8"
    android:paddingTop="1dp" />

也向下移动了。 - ViH
1
请发布您的完整XML。 - Srdan
我尝试仅使用此布局与非常大的文本 - 仍然向下偏移。 - ViH
很遗憾,如果文本比布局还要大,它将无法压缩。我给你的答案只适用于布局高度和宽度为90dp的情况。解决方案是让按钮变大或者文本变小。 - Srdan

0

嗯,我建议如果你将文本大小设置为450sp,它会给你完美的输出

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:textSize="450sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"

        android:text="8" />
</LinearLayout>

输出

enter image description here


是的,我知道。但在我的情况下,文本大小很关键。我有一个带有许多此类按钮的网格,我不能再减小字体大小了。我只需要在整个按钮高度上居中的文本(甚至截断顶部和底部)。 - ViH
你所说的“grid”是什么意思?你要实现的确切视图是什么?请分享屏幕截图。 - Aditya Vyas-Lakhan
网格 - 我的意思是许多线性布局,但这并不重要。问题在我的主要帖子上可见(简单布局)。为什么如果我们设置字体大小为490sp,数字会向下移动?空间在那里。如何删除此隐藏的顶部填充。我现在正在尝试使用minHeight:https://dev59.com/questions/0mQo5IYBdhLWcg3wBLYo#19300777 - 没有结果。 - ViH
当然很重要...如果您正在尝试设置多个类似的视图,请与RecyclerView一起使用并进行自定义...也许您的问题会得到解决。 - Aditya Vyas-Lakhan

0
在你的情况下,定义的 TextView 尺寸对于你正在测试的设备来说过大。如果你使用更高分辨率的设备测试相同的布局,你将会得到所期望的结果。 你需要做的就是通过在 res/values-ldpi、values-mdpi、values-hdpi、values-xhdpi 等不同的目录下定义不同的 "textSize" 值,为不同分辨率的设备定义不同的文本大小。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button
        android:textSize="@string/textSize"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center_vertical"
        android:gravity="center"
        android:textAlignment="center"
        android:includeFontPadding="false"
        android:text="8" />
 </LinearLayout>  

是的,我知道这一点。但在我的情况下,文本大小很关键。我有一个带有许多此类按钮的网格,我无法再减小字体大小了。我只需要在完整按钮高度上居中的文本(甚至是截断顶部和底部)。 - ViH
在您的网格中,为所有项目使用相同的文本大小。这样,结果将会如预期一样。 - Akanksha Hegde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接