0

这似乎是一个非常简单的问题,但由于某种原因,我发现自己找不到任何合适的答案。我所拥有的是 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);

            }
        });
4

3 回答 3

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);
    }
});
于 2013-01-18T18:53:10.510 回答
1

这可以是您的 Activity 的内部类。

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 中常见的一种模式。

于 2013-01-18T18:48:23.743 回答
0

有很多方法可以做到这一点。

您应该在您的活动中实现一个处理程序(链接到 UI 线程)并从一个新线程发布一个 sendMessageDelayed

编辑: Scott W. 有权利:在相同的逻辑中,您可以使用命令

PostDelayed(Your_runnable, time_to_wait)

于 2013-01-18T18:41:45.633 回答