我們的觀點之一是其作爲其根部佈局。當設備旋轉並調用時,我們希望能夠獲得ScrollView
的新寬度/高度。我們的代碼看起來是這樣的:如何在onConfigurationChanged中獲取新的寬度/高度的根佈局?
@Override
public void onConfigurationChanged(Configuration newConfig) {
Log.d(TAG, "Width: '" + findViewById(R.id.scrollview).getWidth() + "'");
Log.d(TAG, "Height: '" + findViewById(R.id.scrollview).getHeight() + "'");
super.onConfigurationChanged(newConfig);
Log.d(TAG, "Width: '" + findViewById(R.id.scrollview).getWidth() + "'");
Log.d(TAG, "Height: '" + findViewById(R.id.scrollview).getHeight() + "'");
}
我們AndroidManifest.xml中的相關部分看起來是這樣的:
<activity android:name=".SomeActivity"
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
最後,我們的佈局的相關部分看起來是這樣的:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scrollview"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
>
<LinearLayout android:id="@+id/container"
android:orientation="vertical"
android:layout_height="fill_parent"
android:minHeight="200dip"
android:layout_width="fill_parent"
>
在我們的Droid上,我們預計ScrollView的寬度在切換到橫向時會變爲854,在切換回肖像時會變爲480(並且高度做等效開關,減去菜單欄) 。但是,我們看到的是相反的情況。下面是我們的logcat:
// Switching to landscape:
03-26 11:26:16.490: DEBUG/ourtag(17245): Width: '480' // Before super
03-26 11:26:16.490: DEBUG/ourtag(17245): Height: '778' // Before super
03-26 11:26:16.529: DEBUG/ourtag(17245): Width: '480' // After super
03-26 11:26:16.536: DEBUG/ourtag(17245): Height: '778' // After super
// Switching to portrait:
03-26 11:26:28.724: DEBUG/ourtag(17245): Width: '854' // Before super
03-26 11:26:28.740: DEBUG/ourtag(17245): Height: '404' // Before super
03-26 11:26:28.740: DEBUG/ourtag(17245): Width: '854' // After super
03-26 11:26:28.740: DEBUG/ourtag(17245): Height: '404' // After super
顯然,我們得到的畫像尺寸,當我們切換到橫向,景觀尺度,當我們切換到肖像。有什麼我們做錯了嗎?我們可能會冒險並解決這個問題,但我覺得我們錯過了一個簡單的解決方案。
這正是我們害怕的。我們可以想到的第一個解決方案是產生一個線程,等待100ms或其他東西,然後獲取寬度/高度。有什麼比我們能做的更簡單嗎? – jakeboxer 2010-03-26 18:07:00
產生線程?哦,不,不要這樣做!您可以簡單地在處理程序中發佈Runnable(或在使用View.post()的UI線程中)。您還可以向ViewTreeObserver註冊偵聽器,在自定義視圖中等待調整大小更改事件等。 – 2010-03-26 18:51:46
Listening到ViewTreeObserver聽起來像是對我最好的解決方案,因爲我確實發現等待方法有點冒失。 – jqpubliq 2010-03-26 19:06:03