Блокировка кнопки с таймером, отображаемым на кнопке в Android Studio - PullRequest
0 голосов
/ 18 октября 2018

Я работаю над приложением для Android, в котором я показываю видео с вознаграждением и хочу, чтобы эта кнопка была заблокирована на 10 минут, я хочу, чтобы таймер отображался на кнопке после ее использования, вот мой java-файл

watch_video_buuton.setOnClickListener(new View.OnClickListener() {

     @Override
     public void onClick(View view) {

        Toast.makeText(Home_page.this,"Please tap more times to load the ad", Toast.LENGTH_LONG).show();

        if (mRewardedVideoAd.isLoaded()) {
                mRewardedVideoAd.show();
        }
        else {
                loadRewardedVideoAd();
       }

    }
 });


@Override
public void onRewardedVideoAdLoaded() {
}

@Override
public void onRewardedVideoAdOpened() {

}

@Override
public void onRewardedVideoStarted() {

}

@Override
public void onRewardedVideoAdClosed() {

    loadRewardedVideoAd();

}

@Override
public void onRewarded(RewardItem rewardItem) {

    Toast.makeText(Home_page.this,"Congratulations, you will get 1000 points next time you open the app ", Toast.LENGTH_LONG).show();

    SharedPreferences sp = getSharedPreferences("your_prefs", Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();

    int n =  myIntValue+1000;
    editor.putInt("your_int_key", n);
    editor.commit();
    user_id_child.child("scores").setValue(+n);

}

1 Ответ

0 голосов
/ 19 октября 2018

Вы можете использовать приведенный ниже код для вашей кнопки:

public void button_OnClick(View view) {
    Button button=findViewById(R.id.button);
    button.setEnabled(false);

    final long startTime= Calendar.getInstance().getTime().getTime();
    final Timer timer=new Timer();
    final Activity activity = this;
    TimerTask task=new TimerTask() {
        @Override
        public void run() {
            long curentTime=Calendar.getInstance().getTime().getTime();
            long elapsedTime=curentTime-startTime;
            ToastTime(10*60*1000, elapsedTime);
            if(curentTime-startTime>=10*60*1000){  //10 minutes in millisecond
                timer.cancel();
                EnableButton();
            }
        }
    };
    timer.schedule(task, 500, 2000);
}

Где

private void ToastTime(long totalTime, long elapsedTime){
    final int remainInSec = (int)(totalTime - elapsedTime) / 1000;
    if(remainInSec>0) {
        final Activity activity = this;
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(activity, String.valueOf(remainInSec) + " seconds to enable button", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

private void EnableButton(){
    Button button=findViewById(R.id.button);
    button.setEnabled(true);
}

Или для упрощения:

public void button_OnClick(View view) {
    final Button button=findViewById(R.id.button);
    button.setEnabled(false);

    final long startTime= Calendar.getInstance().getTime().getTime();
    final Timer timer=new Timer();
    TimerTask task=new TimerTask() {
        @Override
        public void run() {
            long curentTime=Calendar.getInstance().getTime().getTime();
            long elapsedTime=curentTime-startTime;
            ToastTime(10*60*1000, elapsedTime);
            if(curentTime-startTime>=10*60*1000){  //10 minutes in millisecond
                timer.cancel();
                button.setEnabled(true);
            }
        }
    };
    timer.schedule(task, 500, 2000);
}

private void ToastTime(long totalTime, long elapsedTime){
    final int remainInSec = (int)(totalTime - elapsedTime) / 1000;
    if(remainInSec>0) {
        final Activity activity = this;
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(activity, String.valueOf(remainInSec) + " seconds to enable button", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

Редактировать

Если у вас ошибка many run on main thread, попробуйте следующее: Объявите глобальную переменную:

boolean isLooperCalled;

Теперь используйте это:

public void button_OnClick(View view) {
    final Button button=findViewById(R.id.button);
    button.setEnabled(false);

    isLooperCalled=false;   //It's new
    final long startTime= Calendar.getInstance().getTime().getTime();
    final Timer timer=new Timer();
    TimerTask task=new TimerTask() {
        @Override
        public void run() {
            if(isLooperCalled==false){   //It's new
                Looper.prepare();
                isLooperCalled=true;
            }
            long curentTime=Calendar.getInstance().getTime().getTime();
            long elapsedTime=curentTime-startTime;
            ToastTime(10*60*1000, elapsedTime);
            if(curentTime-startTime>=10*60*1000){  //10 minutes in millisecond
                timer.cancel();
                button.setEnabled(true);
            }
        }
    };
    timer.schedule(task, 500, 2000);
}

private void ToastTime(long totalTime, long elapsedTime){
    final int remainInSec = (int)(totalTime - elapsedTime) / 1000;
    if(remainInSec>0) {   //It's edited
        Toast.makeText(this, String.valueOf(remainInSec) + " seconds to enable button", Toast.LENGTH_SHORT).show();
    }
}

Если ошибка не устранена, увеличьте шаг по времени в timer.schedule(task, 500, 2000) с 2000 до 5000 из 10000 (5 секунд или 10 секунд).

...