Кнопка установки кнопок Android невидима без щелчка

Это кажется очень простой проблемой, но по какой-то причине я не могу найти подходящие ответы, которые работают. У меня есть 2 кнопки, одна из которых наложена на другую в макете фрейма, и при нажатии кнопки 1 она становится невидимой, и появляется кнопка 2. Я пытаюсь добиться того, чтобы через несколько секунд 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);

            }
        });

person BossWalrus    schedule 18.01.2013    source источник
comment
stackoverflow.com/questions/1877417 /   -  person Simon    schedule 18.01.2013


Ответы (3)


Более простое решение, чем многие из предложенных здесь, было бы следующим:

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);
    }
});
person Scott W    schedule 18.01.2013
comment
Вы, сэр, великолепны! Большое спасибо, что сделали это на отлично! - person BossWalrus; 18.01.2013

Это может быть внутренний класс для вашей деятельности.

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) выполняются в потоке пользовательского интерфейса, вам следует обращаться к mCurTask только в потоке пользовательского интерфейса, если вы хотите сделать его безопасным.

AsyncTasks очень удобно использовать, это может быть излишним для вашего конкретного сценария, но это шаблон, который распространен в Android.

person accordionfolder    schedule 18.01.2013
comment
Большое спасибо за помощь и за то, что дали мне свои знания! Очень очень ценю!! - person BossWalrus; 18.01.2013
comment
Lol, это излишне для ситуации, единственное, что я бы добавил к принятому ответу, - это проверка релевантности кнопок в ситуации, то есть обнуление их в onPause и проверка на нуль в отложенном запуске. - person accordionfolder; 18.01.2013
comment
Хотя когда-нибудь мне это пригодится! В этом нет сомнений! - person BossWalrus; 19.01.2013

Есть много способов сделать это.

Вы должны реализовать обработчик в своей деятельности (ссылка на поток пользовательского интерфейса) и отправить sendMessageDelayed из нового потока

Редактировать: Скотт В. имеет право: по той же логике вы можете использовать команду

PostDelayed(Your_runnable, time_to_wait)

person Goo    schedule 18.01.2013