2013-04-10 134 views
0

我在調用setContentView()之後獲取有關視圖的信息時出現問題。點擊按鈕後,我將更改活動的佈局。這是我的代碼的例子。等待setContentView()方法

public void onClickButton1(View v) { 
    setContentView(R.layout.activity_main); 
    setScreen(); 
} 

但durring執行setScreen()方法,佈局仍不會呈現,所以我不能叫上一些人認爲意在佈局(分別是我,但我總是得到0)getWidth()。我怎樣才能等到setContentView()完成?請注意,使用這個:

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    setScreen(); 
}  

對我來說是不夠的。我需要在活動週期中獨立更改佈局。

+0

請問爲什麼你這樣做而不是使用新的'Activity'或'Fragments'?這通常不是一個好辦法,恕我直言, – codeMagic 2013-04-10 18:13:49

+0

我在android開發中很新,在我看來,它是最簡單的方法。可能是我應該改變我的方法。非常感謝 – Mara 2013-04-10 18:42:15

+0

雖然我同意codeMagic關於使用活動和片段,對於正在通過Android編碼學習他們的方式的人,我建議做同樣有效的工作..只是要意識到它可能不是最好的內存/設備支持/穩定性。一旦你開始思考Java和android/gradle開發,那麼你會發現你會在學習一種有效的方法/方法的幾天內重新編寫/重新編碼你的應用程序。 – Mayhem 2014-02-03 02:21:49

回答

0

你需要一個ViewTreeObserver重視你的佈局:

setContentView(R.layout.yourLayoutName); 
    View yourLayout = findViewById(R.id.ID_OF_YOUR_LAYOUT); 
    ViewTreeObserver vto = yourLayout.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 

      //Do your work 
      vto.removeOnGlobalLayoutListener(this); 
     } 
    }); 
+0

它的工作原理。非常感謝 – Mara 2013-04-10 18:46:31

+0

@Mara在這種情況下,請點擊左邊的複選標記接受答案作爲解決方案 – 2013-04-10 18:47:15

+0

雖然在某些方面仍然在學習繞過Java的方法,但在我的片段中使用此方法。 ViewTreeObserver vto對象需要成爲最終的..這是因爲如果在onGlobalLayout中調用removeOnGlobalLayoutListener – Mayhem 2014-02-03 02:29:57

0

有沒有簡單的方法來使用setContentView()來得到你想要的結果。您可能需要完全刪除所有的意見,然後擡高新的佈局,使用ViewFlipper,以不同的視圖之間切換,或者,這是恕我直言最好的方法,返工您的應用程序使用Fragments

+0

您可以調用'setContentView(...)'多少次沒有限制。在一個活動中管理多個佈局是一件很痛苦的事情,但它是可能的。 – dymmeh 2013-04-10 18:39:47

+0

不,但沒有簡單的方法可以使用'setContentView()'來達到OP的要求。我會編輯我的答案,因爲它可能會誤導 – 2013-04-10 18:43:13

+0

好的。感謝您的提前。 – Mara 2013-04-10 18:49:23