文本大小更改后,按钮错误地绘制背景

时间:2017-04-23 14:21:34

标签: android android-layout

我在LinearLayout放了一堆按钮,每个按钮weight=1。问题是,当setTextSize被调用时,它有时会改变绘制背景的空间(因此,如果新文本大小较小,则一个按钮感知所有其他按钮的高度FE 2/3) 。即使绘制的大小发生变化,也永远不会调用onSizeChanged。该按钮不会改变它的位置(由getLocationInWindow调试)也不会改变它的大小(getWidth,getHeight)。

我做错了什么,或者至少有办法解决它?

MainActivity:

import android.app.ActionBar;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ViewGroup mainLayout = (ViewGroup)findViewById(R.id.mainLayout);
        LinearLayout l = new LinearLayout(this);
        mainLayout.addView(l);
        for (int i = 0; i < 8; i++) {
            Button b = new Button(this);
            LinearLayout.LayoutParams p1 = new LinearLayout.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, 200);
            p1.weight = 1;
            b.setLayoutParams(p1);
            b.setBackgroundColor(Color.YELLOW);
            l.addView(b);
        }

        Button b = ((Button)l.getChildAt(7));
        b.setTextSize(50f);
    }
}

为了它的全部,XML:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mainLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="dracek.fit.cvut.cz.test.MainActivity">

</android.support.constraint.ConstraintLayout>

我尝试了所有这些按钮,但没有改变:

requestLayout();
invalidate();
ViewParent vp = getParent();
if (vp != null)
    vp.requestLayout();

1 个答案:

答案 0 :(得分:0)

如果没有其他人这样做,我会回答自己。

最后我发现,LinearLayout无论出于什么原因试图让所有文本基线处于相同的高度,从而移动按钮。添加一行可以解决问题:

p1.gravity =Gravity.FILL;