当前位置: 首页 > news >正文

Android TableLayout中TextView文本不居中问题

在这里插入图片描述

概述

| 平台
    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;@Overrideprotected 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"}));}@Overridepublic void onClick(View view) {Log.d("TableLayoutTest", "onClick " + ((TextView)view).getText().toString());}
}

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

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

lv.postDelayed(new Runnable() {@Overridepublic 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><TextViewstyle="@style/TV"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:text="7"/><TextViewstyle="@style/TV"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:text="8"/><TextViewstyle="@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 属性,使特定列自动拉伸以填充空间,从而在特定情况下实现内容居中。
<TableLayoutandroid: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”>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 大数据-91 Spark 集群 RDD 编程-高阶 RDD广播变量 RDD累加器 Spark程序优化
  • FastAPI vs Flask: 专业对比与选择
  • 使用 setResponseStatus 函数设置响应状态码
  • Prometheus Operator部署管理
  • SQL每日一题-0823(难度提升题)
  • SpringCloud Gateway及 Springboot 服务 跨域配置
  • gcc: leaf function/non-leaf function;末节函数,叶子函数
  • conda虚拟环境中安装cuda和cudnn
  • Milvus向量数据库-磁盘索引简介
  • HTTP 414错误问题
  • 第三课《排序》
  • 【html+css 绚丽Loading】 10个Loading合集(1)
  • 如何利用命令模式实现一个手游后端架构
  • 通过主成分分析实现检测金融中的异常交易模式
  • 学习node.js 十 redis的基本语法
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • Git同步原始仓库到Fork仓库中
  • Intervention/image 图片处理扩展包的安装和使用
  • js面向对象
  • 解析 Webpack中import、require、按需加载的执行过程
  • 扑朔迷离的属性和特性【彻底弄清】
  • 普通函数和构造函数的区别
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 区块链分支循环
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 优秀架构师必须掌握的架构思维
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ###C语言程序设计-----C语言学习(3)#
  • #pragma data_seg 共享数据区(转)
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (2.2w字)前端单元测试之Jest详解篇
  • (2020)Java后端开发----(面试题和笔试题)
  • (7)svelte 教程: Props(属性)
  • (javaweb)Http协议
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (篇九)MySQL常用内置函数
  • (转)3D模板阴影原理
  • (转)Scala的“=”符号简介
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)母版页和相对路径
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • .net FrameWork简介,数组,枚举
  • .Net 执行Linux下多行shell命令方法
  • .Net8 Blazor 尝鲜
  • .net反混淆脱壳工具de4dot的使用
  • .NET关于 跳过SSL中遇到的问题
  • .py文件应该怎样打开?
  • .skip() 和 .only() 的使用
  • @selector(..)警告提示
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [acwing周赛复盘] 第 94 场周赛20230311