TableLayout调整视图大小,即使文本大小固定也是如此

时间:2018-11-12 10:03:51

标签: java android android-layout

我在TableLayout中有一些方形的TextView。我必须以编程方式调整文本大小。无法使用新的“自动调整大小”,我需要自行设置文本大小。

所以,我的方法是在表布局中为TextViews设置固定的layout_height和layout_width,并在代码中使用setTextSize。

问题是,一旦调整了文本大小,就会开始发生奇怪的事情,不仅是正在编辑的TextView /单元,还包括相邻的单元!

第一次调整文本大小时,相邻单元格会受到影响(参见图片)。在真实电话(API24)和仿真器(API 24、28)上都会发生这种情况。第二次调整文本大小时,第二个单元格将在模拟器上恢复正常。在实际设备上,第一个单元格会再次调整大小,或者顶部边距会增加。

layout problems

我尝试更改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);
                }
            }

        });
    }



    }

2 个答案:

答案 0 :(得分:2)

首先要了解的是android:baselineAligned的实际含义。

此属性默认设置为true,并控制同级TextView在水平LinearLayout中的垂直位置。 TextView将根据需要向上或向下推,以确保所有文本基线(文本所在的假想线)对齐。

enter image description here

接下来要意识到的是,TableRowLinearLayout的子类,并且是水平的。

因此,如果要完全控制TextViewTableRow的垂直位置,则应设置android:baselineAligned="false"以避免系统覆盖您。

enter image description here

编辑

TextView的尺寸对基线对齐没有影响; LinearLayout会(a)根据需要上下移动TextView,并且(b)将TextView内的文本 上下移动为确保基线对齐所必需的。

这是一个演示。我设置了背景色,使所有内容都很明显。父级LinearLayout的高度固定为100dp,第一个TextViewwrap_content,第二个40dp(大于所需高度),并且第三个是16dp(比需要的小)。

enter image description here

这一切都是为了确保基线对齐。 LinearLayout将竭尽所能,除非您禁用基线对齐。

答案 1 :(得分:0)

我设法通过关闭LinearAlign,TableLayout和TableRow的baselineAligned来解决此问题:

<input class="row-input" type="text" value="<%out.print(index);%>"></input>

不确定为什么这样做,如果有人有更好的解释,我会接受作为答案。