2011-06-14 39 views
1

我有一個主佈局,我希望根據定時器和用戶輸入按順序顯示/隱藏各種自定義佈局。在父佈局中依次包括各種視圖類

在我的例子,我想下面的時間表:

  1. 顯示的初始佈局,由類MainStart創建。當用戶準備開始時,用戶將點擊按鈕。

  2. 用戶點擊後,我們會運行一個倒數計時器,顯示倒數到屏幕。這由MainCountdown完成。

  3. 倒數完成後,顯示MainLast。它有一個按鈕,允許用戶點擊「再次?」。當他們想要重新開始時。

  4. 如果用戶點擊「再次?」然後轉到步驟1.

this question,我可能不得不使用removeView()和addView()來達到我想要的。

我推到GitHub上的什麼我想要做一個下調版本:Hide and Show Layouts所以你可以看到一切,但這個問題似乎歸結爲myView在此之後仍然可見:

myView = inflate(mContext, R.layout.main_start, _view_group); 
myView.setVisibility(View.GONE); 

direct link to code on GitHub

direct link to related layout

我可以做一個小的變化,以我的代碼/佈局,使意見隱藏/顯示我想要的方式?

我完全是這樣做不對

+1

該代碼似乎是以某種錯誤的方式進行的,但我不確定我是否仍然遵循您的意圖。你能用文字描述你想完成的事情嗎?不僅僅是「顯示/隱藏佈局」..我的意思是描述可能是你期望發生的時間線。你看過[ViewFlipper](http://developer.android.com/reference/android/widget/ViewFlipper.html)嗎? – Joe 2011-06-14 03:10:39

+0

@Joe,謝謝你的建議;我已經爲我正在嘗試做的事添加了我的英文說明。 – 2011-06-14 03:18:55

+0

此外,感謝提醒我關於ViewFlipper,但在我的真實應用程序中,視圖需要根據用戶點擊顯示,而不是按特定順序顯示。簡單地看一眼那個頁面,我沒有看到「displayView(index)」的方法 – 2011-06-14 03:22:21

回答

1

從1-4步開始,這聽起來像是一個自定義視圖可能是矯枉過正,但如果因爲某種原因,你需要它是一個自定義視圖,它仍然可以很容易地完成......而且它可以使用ViewFlipper(或其他ViewAnimator)完成,或者您可以簡單地擁有3個兄弟姐妹,並根據需要設置每個孩子的可見性。鳥瞰視圖會是這樣的......

<ViewSwitcher 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent"> 

    <Button 
     android:id="@android:id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Go" /> 

    <TextView 
     android:id="@android:id/text1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <Button 
     android:id="@android:id/button2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Again" /> 

</ViewSwitcher> 
  1. startCountdown():setDisplayedChild(1) - 這是TextView的。同時開始倒計時:這可以是一個Timer對象,或者使用View#postDelayed()。

  2. onCountdownComplete():setDisplayedChild(2) - 這顯示結束「再次?」按鈕。

  3. BUTTON2的的onClick:setDisplayedChild(0)

倒計時可以與postDelayed()和一個Runnable對象來完成,以使計數器遞減,或可能更多高性能:使用sendEmptyMessageDelayed()。當收到該處理程序消息時,遞減內部計數器並更新TextView。

編輯 倒計時另一種選擇是CountDownTimer - 類似的概念,但更多的是「回調」的感覺。您的tick時間間隔爲1000,millisInFuture1000 * <numberOfSeconds>。在onTick()方法中,使用millisUntilFinished/1000更新TextView。在onFinish()方法中,調用setDisplayedChild(2)。

+0

謝謝,喬!我需要他們成爲自定義的觀點;真正的應用程序具有更復雜的佈局,並且比我的示例做更多的事情。 在您的示例中,您已對setDisplayedChild()中的整數進行了硬編碼。有沒有一種首選的方法來獲得每個孩子的指數?也許button1Id = findViewById(「id/theviewswitcher」)。getViewId(「id/button1」)?? – 2011-06-14 03:54:52

+0

是的,我正在使用CountDownTimer。 (並不是說你很容易在GH上找到它):-) – 2011-06-14 03:56:29

+0

如果你必須通過id來引用它,並且它不像button1/text1/button2那麼簡單,那麼你最好不要使用** ViewFlipper,而倒計時可以擴展'ViewGroup'或'FrameLayout'。然後,您可以使用類字段來顯式引用視圖(是的,使用'findViewById()'),並根據需要隱藏/顯示視圖。上面的例子基於button/countdown/button的一個有限的例子,其中ViewFlipper很容易。我建議**不要**使用removeView()和addView(),因爲這會招致更多的開銷。 – Joe 2011-06-14 04:06:40