如何在Activity.onConfigurationChanged中强制重绘视图

时间:2012-03-06 20:15:52

标签: android android-layout

我在线性垂直布局中的活动中有三个视图。顶视图和底视图具有固定的高度,中间视图具有可用的任何高度。这就是我设置视图大小的方法:

void resize(int clientHeight)
{
    int heightMiddle = clientHeight - heightTop - heightBottom;
    topView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, heightTop));
    middleView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, heightMiddle));
    bottomView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
}

为了获得clientHeight,我重写了onMeasure()函数并在我的重写的onMeasure()函数中调用了resize()。这在onCreate()中运行良好。但是,当手机方向改变时,它不起作用。我观察到的是在onCreate()之后,onMeasure()被调用两次。在onConfigurationChanged()之后,onMeasure()只被调用一次,我的调整大小代码没有机会生效。我的kluge解决方案是设置一个计时器,以便在20ms之后调用resize():

timer.schedule(new TimerTask()
{
    @Override
    public void run()
    {
        activity.runOnUiThread(new UiTask());
    }
}, 20);

UiTask只会调用resize()。这对我有用,但我觉得必须有一个更好的解决方案。有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:1)

为什么不让LinearLayout在android:layout_weight属性的帮助下进行布局?这样,你根本不需要任何额外的代码,一切都会正常工作。以下是 res / layout / main.xml 的外观:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <TextView
        android:layout_width="match_parent" 
        android:layout_height="50dp"
        android:text="Top"
        android:layout_weight="0" 
        android:background="#ff0000"
        />
    <TextView  
        android:layout_width="match_parent" 
        android:layout_height="match_parent"
        android:text="Middle"
        android:layout_weight="1" 
        android:background="#00ff00"
        />
    <TextView  
        android:layout_width="match_parent" 
        android:layout_height="25dp"
        android:text="Bottom"
        android:layout_weight="0" 
        android:background="#0000ff"
        />
</LinearLayout>

除了常规

之外没有其他代码
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

它在肖像中看起来像这样:

enter image description here

并在风景中像这样(自动重新传输和重绘):

enter image description here

对于清单中的活动,无论有没有android:configChanges="orientation"都可以使用。如果需要,您还可以使用Java代码设置上述布局。