Android TableLayout中TextView文本不居中问题

news2024/11/22 23:40:28

在这里插入图片描述

概述

| 平台
    RK3288 + Android 8.1 + compileSdkVersion 26.

| 问题
    使用了TableLayout布局电话的拨号按键界面, 效果如下图 (正常):
在这里插入图片描述
在后续开发过程的某次修改后, 出现效果图(不正常):
在这里插入图片描述

合并两张效果图可看得更明显(红线参考位置):
在这里插入图片描述
在布局中 TextViewandroid:gravity=center 已经设置, 从图中可以看出在垂直方向的居中失效了

排查

themes.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="dw" type="dimen">60dp</item>
    <item name="dh" type="dimen">42dp</item>
    <style name="TV">
        <item name="android:textColor">#FF000000</item>
        <item name="android:gravity">center</item>
        <item name="android:textSize">22sp</item>
        <item name="android:layout_width">@dimen/dw</item>
        <item name="android:layout_height">@dimen/dh</item>
        <item name="android:layout_marginLeft">6dp</item>
        <item name="android:layout_marginTop">6dp</item>
        <item name="android:background">@drawable/selector_tv_bg</item>
    </style>

</resources>

table_layout_test.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff7f7f9">

    <ListView android:id="@+id/lv"
        android:layout_width="400dp"
        android:layout_height="400dp"
        />

    <RelativeLayout android:id="@+id/rlPhone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/lv"
        android:background="#220000FF">

        <TableLayout android:id="@+id/tl"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <TableRow>
                <TextView style="@style/TV"
                    android:text="7"/>
                <TextView style="@style/TV"
                    android:text="8"/>
                <TextView style="@style/TV"
                    android:text="9"/>
            </TableRow>
            <TableRow>
                <TextView style="@style/TV"
                    android:text="4"/>
                <TextView style="@style/TV"
                    android:text="5"/>
                <TextView style="@style/TV"
                    android:text="6"/>
            </TableRow>
            <TableRow>
                <TextView style="@style/TV"
                    android:text="1"/>
                <TextView style="@style/TV"
                    android:text="2"/>
                <TextView style="@style/TV"
                    android:text="3"/>
            </TableRow>
            <TableRow>
                <TextView style="@style/TV"
                    android:text="*"/>
                <TextView style="@style/TV"
                    android:text="0"/>
                <TextView style="@style/TV"
                    android:text="#"/>
            </TableRow>
        </TableLayout>

    </RelativeLayout>
</RelativeLayout>

TableLayoutTest.java


public class TableLayoutTest extends Activity implements View.OnClickListener {
	ListView lv;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.table_layout_test);

		ViewGroup tl = (ViewGroup) findViewById(R.id.tl);
		for(int i = 0; i < tl.getChildCount(); i ++){
			ViewGroup row = (ViewGroup) tl.getChildAt(i);
			for(int j = 0; j < row.getChildCount(); j ++){
				row.getChildAt(j).setOnClickListener(this);
			}
		}

		lv = (ListView) findViewById(R.id.lv);
		lv.setAdapter(new ArrayAdapter<String>(TableLayoutTest.this,
						R.layout.lv_item,
						new String[]{"001", "002", "003", "004", "004"}));
		
	}



	@Override
	public void onClick(View view) {
		Log.d("TableLayoutTest", "onClick " + ((TextView)view).getText().toString());
	}
}

布局并不复杂, 一个ListView 加上一个 RelativeLayout, 于是, 把ListView先去带掉, 果然好了, 这问题就很谜了.
这不合理, 于是, 布局不变, 去掉 lv.setAdapter, 结果也是好的…

判断会不会是时序的原因, 于是延迟 3秒 setAdapter:

lv.postDelayed(new Runnable() {
			@Override
			public void run() {
				lv.setAdapter(new ArrayAdapter<String>(TableLayoutTest.this,
						R.layout.lv_item,
						new String[]{"001", "002", "003", "004", "004"}));
			}
		}, 3000);

好吧, 刚开始是好的, ListView有内容了后, 出现:
在这里插入图片描述


原因参考自ChatGpt

可能原因

  1. TableLayout 的宽度: 由于你使用的是 wrap_contentTableLayoutTableRow 的宽度可能根据子元素的内容大小进行调整。如果 TableLayoutTableRow 的宽度与 TextView 的内容宽度相近,gravity="center" 可能无法正常生效。

  2. TableRow 默认行为: TableRow 中的子元素默认是按内容宽度排列的,而不是平分整个行的宽度。这可能导致 TextView 的内容没有在整个单元格内居中。

解决方法

为了确保 TableLayout 中的 TextView 内容能够正确居中,可以考虑以下方法:

  1. TextView 设置 layout_width="0dp" 并加上 layout_weight="1": 这将使每个 TextView 在同一行内平分可用空间,从而使文本居中。
<TableRow>
    <TextView
        style="@style/TV"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:text="7"/>
    <TextView
        style="@style/TV"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:text="8"/>
    <TextView
        style="@style/TV"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:text="9"/>
</TableRow>
  1. TableLayoutstretchColumns 属性: 你可以使用 TableLayoutstretchColumns 属性,使特定列自动拉伸以填充空间,从而在特定情况下实现内容居中。
<TableLayout
    android:id="@+id/tl"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:stretchColumns="*">

这里的 android:stretchColumns="*" 表示所有列都可以被拉伸以适应屏幕宽度。

总结

通过设置 layout_width="0dp" 并配合 layout_weight="1",可以确保 TextView 在其单元格中居中显示。stretchColumns 属性也可以> 用来调整列的宽度,确保内容的对齐方式更加合理。试试看是否能解决你的问题!

ChatGPT提供的几种方案并没有解决问题, 方案中提及的原因有待验证.

| 解决方案

  1. 根布局改为FrameLayout
  2. 修改TableLayout的layout_width属性配置, 指定 android:layout_width="match_parent"android:layout_width="300dp" 都可以
  3. TableLayout 用 LinearLayout或其他布局替换
  4. 指定父容器布局宽度, 并设置 TableRow的宽度
    RelativeLayout android:id=“@+id/rlPhone”
    TableLayout android:id=“@+id/tl”
    TableRow android:layout_width=“200dp”>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2059339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计选题推荐-豆瓣书籍可视化分析-Python爬虫-K-means算法

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

65 华为交换机CE6800基础配置

一 IPV6 使能配置思路 1 改华为交换机的名字 <huaweice65>sys Enter system view, return user view with return command. [~huaweice65]sysname HWCE6800 [*huaweice65]quit Warning: Uncommitted configurations found. Are you sure to commit them before exiting?…

数据的储存1(第30天)

补充&#xff1a;该代码在Debug下会死循环而在release版本下会正常运行&#xff0c;因为release会优化代码。 &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;深度剖析数据在内存中的存储&#xff01;&#xff01;&#xf…

如何为PDF文件设置打开密码以保护文档安全

为PDF文件设置打开密码是一种有效的保护措施&#xff0c;它能防止未经授权的用户访问文件内容。以下是一份专业指南&#xff0c;详细介绍如何为PDF文件设置打开密码。 打开pdf编辑器&#xff0c;我们点击工具栏中的【文件】功能&#xff0c;选择里面的【属性】 然后在属性设置…

代码生成:自动化开发

在现代集成开发环境中&#xff0c;智能代码补全和代码生成功能是两个至关重要的组成部分。 智能代码补全利用当前上下文和代码库信息&#xff0c;向程序员推荐合适的代码选项&#xff0c;而代码生成则根据指定输入创建遵循语法和语义规范的代码片段。 许多先进的IDE如Visual St…

家里猫毛到处飞怎么办?如何清理?用宠物空气净化器去除猫毛

我家三只布偶原住民&#xff0c;都是掉毛怪&#xff0c;刚好还是不同的颜色&#xff0c;黑的灰的白的...家里和画板似的&#xff0c;每天都被猫毛上色&#xff0c;清扫时超级崩溃。沙发上、床上、地板上这些常见的地方就不用说了&#xff0c;甚至水杯和碗筷边偶尔也能看见猫毛&…

CTFHub~JWT漏洞靶场最详细教程

什么是JWT JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed…

新手教学系列——Redis分布式锁进阶版:如何实现支持同一个Key多把锁,并带有超时重试功能

在现代分布式系统中,锁机制是解决并发访问资源问题的重要手段之一。Redis作为一个内存数据库,由于其高效的读写能力和天然的分布式特性,常常被用作实现分布式锁的基础工具。然而,如何合理地实现一个支持多把锁的Redis锁,并且在失败时支持超时重试,这是一个进阶的问题。 …

前端面试——this指向

最近看到了面试题目有关于this指向的问题&#xff0c;网上搜了一篇文章&#xff0c;看了之后受益匪浅&#xff0c;特地总结一下。 原文章链接&#xff1a;前端面试中的“this”&#xff0c;你真的了解吗&#xff1f; - 哔哩哔哩 什么是this&#xff1f; this是一个特殊的关键…

华为鲲鹏技术认证是什么?为什么要通过认证?

华为鲲鹏技术认证是什么&#xff1f; 华为鲲鹏技术认证是华为推出的一项生态合作伙伴计划&#xff0c;旨在积极推动从芯片到硬件系统&#xff0c;再到软件、服务的整个国产产业链的共建、共享、共赢。该认证要求测试产品自主可控&#xff0c;满足各地政府信息技术国产化替代工…

【五】阿伟开始学Kafka

阿伟开始学Kafka 概述 人生若只如初见&#xff0c;阿伟心里回想起了第一次和Kafka见面的场景&#xff0c;记忆虽然已经有些模糊&#xff0c;但是感觉初次见面是美好的。积累了一些实战经验之后&#xff0c;阿伟感觉不能再是面对百度开发了&#xff0c;于是决心系统的学习一下Ka…

数据库MySQL之事务、索引

目录 1.概述 2.事务 3.索引 3.1索引结构 3.2操作语法 1.概述 场景&#xff1a;假如我们需要解散教学部&#xff0c;那么该部门下的所有员工都需要删除。如果教学部成功删除了&#xff0c;但员工出于某些原因(比如SQL语句写错了等)并没有删除&#xff0c;此时就会出现数据…

Node 网络详解

Node 网络详解 1、 OSI & TCP/IP模型设计1.1 OSI七层模型应用层&#xff1a;&#xff08;Application Layer&#xff09;表示层&#xff1a;&#xff08;Presentation Layer&#xff09;会话层&#xff1a;&#xff08;Session Layer&#xff09;传输层&#xff1a;&#x…

Mycat分片-水平拆分

目录 场景 准备 配置 测试 续接上篇&#xff1a;Mycat分片-垂直拆分-CSDN博客 场景 在业务系统中, 有一张表(日志表), 业务系统每天都会产生大量的日志数据 , 单台服务器的数据存 储及处理能力是有限的, 可以对数据库表进行拆分。 准备 准备三台服务器&#xff0c;具体的结…

2024年Google开发者大会:AI赋能的Web、移动和云开发

一、大会概览 1.1 开幕与主题演讲 在北京国家会议中心举办的2024年Google开发者大会&#xff0c;是一场汇聚了全球顶尖开发者和技术爱好者的盛会。大会的开幕由Google大中华区总裁陈俊廷先生的主题演讲引领&#xff0c;他不仅回顾了中国开发者在全球技术舞台上的卓越表现&…

华硕飞行堡垒键盘全部失灵【除电源键】

华硕飞行堡垒FX53VD键盘全部失灵【除电源键】 前言一、故障排查二、发现问题三、使用方法总结 前言 版本型号&#xff1a; 型号 ASUS FX53VD&#xff08;华硕-飞行堡垒&#xff09; 板号&#xff1a;GL553VD 故障情况描述&#xff1a; 键盘无法使用&#xff0c;键盘除开机键外…

小型无人机训练与运用技术研究

1. 基础理论与概念 小型无人机&#xff08;Small Unmanned Aerial Vehicle, sUAV&#xff09;作为近年来快速发展的技术领域&#xff0c;其基础理论与概念是理解其全貌的基石。小型无人机通常指质量轻、尺寸小、易于携带和操作的无人飞行器&#xff0c;广泛应用于航拍、环境监…

基于yolov5 红绿灯交通检测,可对道路红绿灯进行检测可根据界面信息直接上传图片,视频等

模型训练&#xff1a;使用特定的数据集来训练YOLOv5模型以准确识别红绿灯。Web界面&#xff1a;构建一个用户友好的Web界面&#xff0c;让用户能够轻松上传图片或视频进行检测。性能优化&#xff1a;针对实时应用进行性能优化&#xff0c;确保检测速度足够快。部署&#xff1a;…

【高级IO-1】探索五种 I/O 模型及其高级I/O技术:基于 fcntl() 的代码应用

文章目录 1. 五种IO模型2. 高级IO的重要概念2.1 同步通信 与 异步通信2.2 阻塞与非阻塞2.3 如何理解四者间的关系&#xff1f; 3. 其他高级IO3.1 非阻塞 I/O3.2 纪录锁&#xff08;Record Lock&#xff09;3.3 系统 V 流机制3.4 I/O 多路复用&#xff08;I/O Multiplexing&…

自养号测评技术:如何挑选适合的IP环境方案

市面上的IP服务及常见问题 当前市场上常见的IP服务包括911、Luminati、Google Fi、TM流量卡、Socks专线等。这些服务在为用户提供网络代理或VPN服务时&#xff0c;常会遇到以下主要问题&#xff1a; 1. 高负载与重复率高&#xff1a;由于使用人数众多&#xff0c;导致网络拥堵…