2011-04-15 129 views
9

中的方向更改我希望我的VIEW佈局在方向更改時進行調整。查看佈局不刷新android

我的清單設置爲:android:configChanges="keyboardHidden|orientation"上的活動。

我有res/layout-land,res/layout-port

我有onConfigurationChanged在我的Activity(它得到的旋轉叫)。

在我的Activity我有一個ViewFlipper,其中我有LinearLayouts

當我在端口或陸地模式下啓動Activity時,視圖的佈局是正確的(根據 到我的res/layout-????文件)。

但是當我已經在Activity和旋轉手機,然後我的視圖佈局不會改變。屏幕旋轉,並且該活動的onCreate未被調用,因爲它應該是,Activity中調用onConfigurationChanged,但屏幕始終使用啓動Activity時加載的LinearLayout重新繪製。

我有一種感覺,我錯過了onConfigurationChanged的東西,但不知道是什麼。我想我需要撥打內部ViewFlipperLinearLayout上的某個功能。我應該撥打什麼功能?

ViewFlipper flipper; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    flipper = new ViewFlipper(getApplicationContext()); 
    setContentView(flipper); 
    initLayout(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    setContentView(flipper); 
} 

void initLayout() { 
    MyView myview = createMyView(0); 
    flipper.addView(myview, 0); 
    myview = createMyView(1); 
    flipper.addView(myview, 1); 
    myview = createMyView(1); 
    flipper.addView(myview, 1); 
} 

我嘗試添加flipper = new ViewFlipper(getApplicationContext());到但使一切旋轉後的黑色。我想我將不得不調用initLayout,但這將重新計算一切(這正是我不想做的,這就是爲什麼我試圖用onConfigurationChanged來做到這一點,而不是android默認的「dropMyActivity & createANewActivity」

SOLUTION: 以前我以爲我可以觸發旋轉被刷新的佈局,但看來我要重新創建與當前上下文的佈局(方位變化後)

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    setContentView(R.layout.category_flipper); 
    ViewFlipper oldFlipper = viewFlipper; 
    viewFlipper = (ViewFlipper)findViewById(R.id.categoryFlipper); 
    for (int i = 0; i < 3; i++) { 
     final CardLayout cl = new CardLayout(this, cardData[i]); 
     viewFlipper.addView(cl); 
    } 
    cardData[viewIndex].restorePlayer(); 
    viewFlipper.setDisplayedChild(viewIndex); 
    oldFlipper.removeAllViews(); 
} 

回答

8

如果flipper是,最初安裝的視圖的引用,這就是造成問題。您需要傳遞所需佈局的資源ID,而不是旋轉手機之前的舊視圖。內容視圖將被綁定到新資源。也許這樣的事情(模我猜你的資源標識符):

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    setContentView(R.layout.flipper); 
    flipper = (ViewFlipper) findViewById(R.id.flipper); 
} 
+0

好了,這似乎是好的方向發展,但仍然必須找出如何將它適合我的情況,我會添加一些更多的代碼到原始問題 – Gavriel 2011-04-17 10:02:22

+1

@Flöcsy - 我正在查看initLayout,其中包含您說您不想重複的工作,但看起來它只是再次創建所有視圖。這正是您在屏幕旋轉時重置顯示屏所需做的。如果您在創建視圖的同時進行昂貴的計算,並且這些視圖確實獨立於配置,則可以按照[在此處]所述捕獲並重新使用它們(http://developer.android.com/resources/articles /faster-screen-orientation-change.html) – 2011-04-17 16:41:26

+0

特德,我認爲你是對的。雖然createMyView是昂貴的工作,但我現在明白了,並且可能我做了更多的工作(例如,我正在解析一個zip文件以查找圖像(在ImageButton上顯示)以及mp3文件(播放按鈕時播放) – Gavriel 2011-04-17 22:25:11

0

把它放在你的android清單中。android:configChanges =「orientation」

在這種情況下,只是試試這個,並設置佈局

...

if (Intraday.this.getResources(). getConfiguration(). orientation == Configuration.ORIENTATION_PORTRAIT){ 


    } 
    else if (Intraday.this.getResources(). getConfiguration(). orientation == Configuration.ORIENTATION_LANDSCAPE) {  


    }