我有一个主要布局,我想根据计时器和用户输入顺序显示/隐藏各种自定义布局。
在我的例子中,我想要以下时间表:
显示由MainStart类创建的初始布局。用户在准备好开始时会点击按钮。
用户点击后,我们将运行一个倒计时器,显示屏幕的倒计时。这是由MainCountdown完成的。
倒计时结束后,会显示MainLast。它有一个按钮,允许用户点击“再次?”当他们想重新开始时。
如果用户点击“再次?”然后转到第1步。
根据this question,我可能必须使用removeView()和addView()来实现我想要的目标。
我向GitHub推送了我想要做的精简版:Hide and Show Layouts所以你可以看到所有内容,但问题似乎归结为myView
之后仍然可见:
myView = inflate(mContext, R.layout.main_start, _view_group);
myView.setVisibility(View.GONE);
我可以对代码/布局进行一些小改动,使视图隐藏/显示我想要的方式吗?
我完全做错了吗??
答案 0 :(得分: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>
startCountdown():setDisplayedChild(1) - 这是TextView。同时开始倒计时:这可以使用Timer对象,也可以使用View#postDelayed()。
onCountdownComplete():setDisplayedChild(2) - 这显示结束“再次?”按钮。
点击按钮2:setDisplayedChild(0)
倒计时可以使用postDelayed()和Runnable对象来减少计数器,或者可能更高效:使用sendEmptyMessageDelayed()。收到该处理程序消息后,递减内部计数器,并更新TextView。
修改强>
倒计时的另一个选择是CountDownTimer - 类似的概念,但它有更多的“回调”感觉。您的时间间隔为1000,millisInFuture
为1000 * <numberOfSeconds>
。在onTick()
方法中,使用millisUntilFinished / 1000
更新TextView。在onFinish()
方法中,调用setDisplayedChild(2)。