我在TableLayout中有一些方形的TextView。我必须以编程方式调整文本大小。无法使用新的“自动调整大小”,我需要自行设置文本大小。
所以,我的方法是在表布局中为TextViews设置固定的layout_height和layout_width,并在代码中使用setTextSize。
问题是,一旦调整了文本大小,就会开始发生奇怪的事情,不仅是正在编辑的TextView /单元,还包括相邻的单元!
第一次调整文本大小时,相邻单元格会受到影响(参见图片)。在真实电话(API24)和仿真器(API 24、28)上都会发生这种情况。第二次调整文本大小时,第二个单元格将在模拟器上恢复正常。在实际设备上,第一个单元格会再次调整大小,或者顶部边距会增加。
我尝试更改TableLayout,TableRow和TextView的不同设置(wrap_content,最小/最大高度),但是除了注释掉setTextSize之外,没有其他解决方法。
我确实需要使用TableLayout,所以用其他布局替换它不是我的选择。
为什么这行不通?
要将问题粘贴粘贴到下面的布局和代码中,将其粘贴到新的“空活动”项目中。在撰写本文时,我正在使用最新的软件(Android Studio 3.2.1,其编译SDK版本为API 28,Java版本为1.8,最低SDK版本为22。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:baselineAligned="false"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mainContainer">
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tableLayout1"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:background="#000">
<TableRow
android:id="@+id/tableRow1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<TextView
android:layout_width="40dp"
android:layout_height="40dp"
android:background="#FFF"
android:textColor="#000"
android:id="@+id/textView1"
android:layout_margin="1dp"/>
<TextView
android:layout_width="40dp"
android:layout_height="40dp"
android:background="#FFF"
android:textColor="#000"
android:layout_margin="1dp"/>
</TableRow>
</TableLayout>
<Button
android:layout_gravity="bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click"
android:id="@+id/button1"/>
</LinearLayout>
我的活动代码是:
package app.howsmydriving.layoutproblem;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private String sContent = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
sContent += "A";
TextView tv = findViewById(R.id.textView1);
tv.setText(sContent);
if(sContent.length() < 3) {
tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 30);
} else {
tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
}
}
});
}
}
答案 0 :(得分:2)
首先要了解的是android:baselineAligned
的实际含义。
此属性默认设置为true
,并控制同级TextView
在水平LinearLayout
中的垂直位置。 TextView
将根据需要向上或向下推,以确保所有文本基线(文本所在的假想线)对齐。
接下来要意识到的是,TableRow
是LinearLayout
的子类,并且是水平的。
因此,如果要完全控制TextView
中TableRow
的垂直位置,则应设置android:baselineAligned="false"
以避免系统覆盖您。
TextView
的尺寸对基线对齐没有影响; LinearLayout
会(a)根据需要上下移动TextView
,并且(b)将TextView
内的文本 上下移动为确保基线对齐所必需的。
这是一个演示。我设置了背景色,使所有内容都很明显。父级LinearLayout
的高度固定为100dp
,第一个TextView
是wrap_content
,第二个40dp
(大于所需高度),并且第三个是16dp
(比需要的小)。
这一切都是为了确保基线对齐。 LinearLayout
将竭尽所能,除非您禁用基线对齐。
答案 1 :(得分:0)
我设法通过关闭LinearAlign,TableLayout和TableRow的baselineAligned来解决此问题:
<input class="row-input" type="text" value="<%out.print(index);%>"></input>
不确定为什么这样做,如果有人有更好的解释,我会接受作为答案。