【问题标题】:How to disable button after click for 5 minutes in Android如何在Android中单击5分钟后禁用按钮
【发布时间】:2016-12-27 07:06:11
【问题描述】:

我是 android 新手。我正在创建一个应用程序,在该应用程序中我必须在单击按钮后禁用它,并在 5 分钟后再次启用它。即使在应用程序关闭后,倒数计时器也应该继续。任何帮助表示赞赏。提前致谢!

【问题讨论】:

  • 尝试使用处理程序
  • @ρяσѕρєяK 如果应用程序关闭,Handler 会工作吗?
  • 不,应用程序关闭时处理程序将停止
  • 你可以创建一个服务来通知监听组件
  • 我建议您使用服务,并在单击按钮时在 SharedPreference 中添加状态,并且 startService 应该会自动更改 SharedPreference 的值,并且应该再次启用您的按钮

标签: android


【解决方案1】:

您可以通过以下代码将时间存储在共享偏好中。

 SharedPreferences  settings = c.getSharedPreferences(PREFS_NAME, 1);
 SharedPreferences.Editor editor = settings.edit();
 editor.putString("click_time", your_time);

每当需要比较时,只需将您当前的时间与偏好存储的时间进行比较即可。检查时间差是否小于 5 分钟。

从偏好中获取时间:

   SharedPreferences  settings = c.getSharedPreferences(PREFS_NAME, 1);
   String storedTime=settings.getString("clic_time", "");

获取分钟差:

   Date current, Date previous;
   long diff = current.getTime() - previous.getTime();
   long minutes = diff / (60 * 1000);

要显示计时器,当应用程序来自后台时,您可以从偏好中获取时间并使用2次之间的差异启动计时器。

【讨论】:

  • 我懒得写这个,我会使用相同的解决方案。只是存储再次启用按钮的时间。使用一个简单的计时器并重建它onCreate 以在保存的时间结束。无需在任何东西上使用服务。
  • 在将价值赋予共享偏好之后,您应该提交它。 .editor.commit();
【解决方案2】:
private long mLastClickTime = 0;

public static final long MAX_CLICK_INTERVAL = 1000; // here you can pass the time interval you want the user to wait for the next click

// and paste the below code on button click 

if (SystemClock.elapsedRealtime() - mLastClickTime < MAX_CLICK_INTERVAL) {
            return;
}
mLastClickTime = SystemClock.elapsedRealtime();

【讨论】:

    【解决方案3】:

    1) 创建一个服务并在其中放入计时器代码

    2) 在服务中,在您完成广播意图后

    3) 在您的活动中编写一个广播接收器并在广播接收器中再次启用按钮。

    关闭应用程序后运行服务查看:How to keep a service running in background even after user quits the app?

    要从服务发送意图到活动,请查看:send intent from service to activity

    一些测试代码

    1)创建服务:

    public class TimeService extends IntentService {
        public TimeService() {
            super("TimeService");
        }
    
    @Override
    protected void onHandleIntent(Intent intent) {
    
       //Your Time Code
    
        //broadcast intent in your app 
        Intent RTReturn = new Intent(MainActivity.RECEIVE);
        RTReturn.putExtra("state", "done");
        LocalBroadcastManager.getInstance(this).sendBroadcast(RTReturn);
    }
    

    2)你的活动

    -创建动作字符串

    //Your activity will respond to this action String
    public static final String RECEIVE = "TIMING";
    

    -创建广播管理器

    private LocalBroadcastManager bManager;
    

    -创建一个广播接收器

    private BroadcastReceiver bReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals(RECEIVE)) {
                String serviceString = intent.getStringExtra("state");
                if(serviceString.equals("done"))
                     // enable your button 
                     btnEnable();
            }
        }
    };
    

    -将意图过滤器放在onCreate()中

     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //make an intent filter
            bManager = LocalBroadcastManager.getInstance(this);
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction(RECEIVE);
            bManager.registerReceiver(bReceiver, intentFilter);
    
    
         }
    

    点击后将其添加到您的按钮中

    //start time service
    Intent intent = new Intent(this,TimeService.class);
    startService(intent);
    

    最后记住两件事:

    首先 -> 将服务添加到您的清单

    second -> 在 onDestroy() 中取消注册广播接收器

    【讨论】:

      【解决方案4】:

      尝试处理程序

      Handler handler = new Handler();
      Runnable runnable = new Runnable() {
          @Override
          public void run() {
      
              // this will disable your button
              yourButton.setEnabled(false);
          }
      };
      
      
      yourButton.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
      
                  // wait for 5 minutes
                  handler.postDelayed(runnable, 5*60*1000);
      
              }
          });
      

      【讨论】:

      • Handler 将在主线程上工作,所以这不是解决这个问题的好方法。
      猜你喜欢
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      相关资源
      最近更新 更多