这似乎是一个非常简单的问题,但由于某种原因,我发现自己无法找到任何合适的答案。我所拥有的是2个按钮,其中一个在框架布局中堆叠在另一个上,当单击Button1时,它变为不可见,并且出现Button2。我想要发生的事情是几秒钟后Button2自动变为不可见,Button1再次可见。这是我的一点代码。任何帮助将不胜感激!
button1 = (Button)findViewById(R.id.button1);
button2 = (Button)findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
button1.setVisibility(Button.GONE);
button2.setVisibility(Button.VISIBLE);
}
});
答案 0 :(得分:4)
比这里提出的许多解决方案更简单的解决方案如下:
button1 = (Button)findViewById(R.id.button1);
button2 = (Button)findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
button1.setVisibility(Button.GONE);
button2.setVisibility(Button.VISIBLE);
button1.postDelayed(new Runnable() {
@Override
public void run() {
button1.setVisibility(View.VISIBLE);
button2.setVisibility(View.GONE);
}
}, 2000);
}
});
答案 1 :(得分:1)
这可以是您的活动的内部类。
public class SleepTask extends AsyncTask<Void, Void, Void>
{
final Button mOne, mTwo;
public OnCreateTask(final Button one, final Button two) {
mOne = one;
mTwo = two;
}
protected Void doInBackground(Void... params)
{
//Surround this with a try catch, I don't feel like typing it....
Thread.sleep(2000);
}
protected void onPostExecute(Void result) {
//This keeps us from updating a no longer relevant UI thread.
//Such as if your acitivity has been paused or destroyed.
if(!isCancelled())
{
//This executes on the UI thread.
mOne.setVisible(Button.VISIBLE);
mTwo.setVisible(Button.GONE);
}
}
}
在您的活动中
SleepTask mCurTask;
onPause()
{
super.onPause();
if(mCurTask != null)
mCurTask.cancel();
}
在你的onClick
if(mCurTask == null)
{
button1.setVisibility(Button.GONE);
button2.setVisibility(Button.VISIBLE);
mCurTask = new SleepTask;
mCurTask.execute();
}
我从头顶做了所有这些,所以它可能不得不通过日食来让它快乐。请记住,所有生命周期调用(onCreate,onDestroy)都是在UI线程上完成的,如果要使其安全,则只应访问UI线程上的mCurTask。
AsyncTasks非常好用,对于特定情况,这可能会过度杀戮,但这是Android中常见的模式。
答案 2 :(得分:0)
有很多方法可以做到。
您应该在活动中实现handler(链接到UI线程)并从新线程发布sendMessageDelayed
修改: Scott W.有权:在相同的逻辑中,您可以使用命令
PostDelayed(Your_runnable, time_to_wait)