2012-03-06 25 views
0

私のアクティビティでは、線形垂直レイアウトで3つのビューがあります。上部と下部のビューは固定された高さを持ち、中央のビューは利用可能なままの高さをとります。これは私がビューのサイズを設定する方法である:Activity.onConfigurationChangedでビューの再描画を強制する方法

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()関数内。これはonCreate()でうまくいきます。しかし、電話の向きが変わっても動作しません。私が観察したことは、onCreate()、onMeasure()が2回呼び出された後です。 onConfigurationChanged()の後、onMeasure()は一度だけ呼び出され、サイズ変更コードは有効になりません。マイクルーゲソリューションをセットアップするために、後にサイズを変更する()は20msを呼び出すためのタイマーです:

UiTaskは、単に()のサイズを変更する呼び出します
timer.schedule(new TimerTask() 
{ 
    @Override 
    public void run() 
    { 
     activity.runOnUiThread(new UiTask()); 
    } 
}, 20); 

。これは私にとってはうまくいくが、よりよい解決策が必要だと感じている。誰かがこれにいくつかの光を当てることができますか?

答えて

1

android:layout_weight属性を使用してLinearLayoutにレイアウトをさせてみませんか?そうすれば、余分なコードは一切必要なくなり、すべてがうまくいくでしょう。

<?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); 
} 

以外の多くのコードと、それは肖像画で次のようになります:

ここであなたの のres /レイアウト/ main.xmlは、次のようになり何です

enter image description here

このような風景(自動的に再レイアウトされ、再描画):

enter image description here

これは、とし、マニフェストでの活動のためのandroid:configChanges="orientation"ない場合の両方で動作します。また、必要に応じてJavaコードを使用して上記のレイアウトを設定することもできます。

+0

完璧なソリューション。ありがとうございました! –

関連する問題