2017-04-23 47 views
0

我在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(); 
+0

请发布[mcve]。所有的代码应该编译没有错误,而不是你所问的。特别是,你的代码都不在一个类中。 –

+0

也发布你的linearlayout xml – yanivtwin

+0

在'setTextSize()'之后调用'requestLayout()'。 – azizbekian

回答

0

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

最后我发现,LinearLayout是出于任何原因试图让所有文本基线在同一高度,从而移动按钮。添加一条线可解决问题:

p1.gravity =Gravity.FILL;