【问题标题】:Lock a Button With timer displayed on the button in android studio在android studio中的按钮上显示带有计时器的锁定按钮
【发布时间】:2018-10-18 19:01:50
【问题描述】:

我正在开发一个 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);

}

【问题讨论】:

  • 嗨@dhruv bhati,欢迎来到 Stack Overflow。为了帮助您更快地获得问题的答案,在您的答案中包含几件事会很有帮助。到目前为止,您向我们提供了您的代码,这非常好。此外,您能否告诉我们您尝试解决问题的方法,以及为什么没有奏效?
  • 另外:我建议对您的帖子进行编辑以删除一些标签。一般来说,Stack Overflow 上的标签应该与您直接询问的内容相关。例如。 “Eclipse”标签应该只用于询问 关于 Eclipse 的问题,而不是任何时候您遇到问题的工作是在 Eclipse 中完成的

标签: java android android-button rewardedvideoad


【解决方案1】:

您可以为您的按钮使用以下代码:

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 增加到100005000(5 秒或10 秒)。

【讨论】:

  • 我想显示解锁该按钮的剩余时间
  • 谢谢,这就是我要找的
  • 嘿,我刚刚在我的应用程序中使用了这个,我看到每当时间完成应用程序崩溃并关闭时,toast 会正确显示,但是当时间完成时应用程序崩溃并显示“应用程序可能在它的主线程上做了太多的工作。”
  • 请帮帮我兄弟,当时间完成时它会显示错误,该应用程序可能在其主线程上做了太多工作
  • 拜托,急需帮助
猜你喜欢
  • 2021-08-31
  • 2015-12-16
  • 2015-04-30
  • 1970-01-01
  • 2012-10-28
  • 2021-04-07
  • 2012-11-13
  • 2015-12-06
  • 2019-05-27
相关资源
最近更新 更多