【问题标题】:Enabling button for a limited time in android app在Android应用程序中的有限时间内启用按钮
【发布时间】:2017-03-27 12:06:51
【问题描述】:

这是一个示例,我希望能够在用户操作后在有限的时间内(比如 30 分钟)启用我的应用中的按钮。 30 分钟后,此按钮将再次被禁用。 在android中实现这一目标的最佳方法是什么?

因为用户可能会重启设备或关闭应用程序,所以我不能简单地使用倒数计时器。即便如此,鉴于有一个特定的时间间隔开始结束日期,我可以简单地检查当前时间并查看按钮的状态应该是什么。但是,用户可以简单地将手机的日期往后放 15 分钟,这样按钮就会继续启用。

【问题讨论】:

  • 你试过alarmmanager吗?
  • 您可以存储上次处理完成的时间,然后将其与当前时间(DATETIME)进行比较。
  • @AmitVaghela 我们可以使用 MVP 吗?
  • 其实不需要用MVP,把这些datetime数据保存到sharedpreference。@AdityaVyas-Lakhan

标签: android


【解决方案1】:

您可以使用 Handler 的 postDelayed 方法。见下文-

    //when use press button
    new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                //disable your button here
            }
        }, 3*1000); //your delay time

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    例如,您可以每分钟使用一次倒计时,然后将该进度保存在配置文件中。当用户有 30 分钟时,您可以禁用该按钮。 您可以将配置文件写入用户无法触摸的应用程序内部文件夹。 如果用户关闭应用程序超过 7 分钟,则在您的配置文件中存在这 7 分钟。如果用户把电话的日期放回去也不在乎;)

    【讨论】:

      【解决方案3】:

      您最好的做法是使用倒计时计时器,该计时器将您的按钮启用时间的进度写入PreferenceHelper。 定义一个间隔,比如 30 秒或 1 分钟,并在您的用户操作完成后立即触发此倒计时。

      根据您选择的时间间隔,每 30 秒或每 1 分钟后更新首选项助手中的值。

      更新间隔为 1 分钟的示例

      public void updateButtonDisableTimer(){
      SharedPreferences sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
      
      int oldTimerValue =  sharedpreferences.getInt("key", 0); // is the default value in case no value is found.
      Editor editor = sharedpreferences.edit();
      if(oldTimerValue > 30){
          //this the case when you need to stop the timer
           editor.putInt("key", 0);
         //Write code to disable the button
      }else{
        int newValue = oldTimerValue + 1; //1 min is interval
        editor.putInt("key", newValue);
      } 
      editor.commit();
      }
      

      这将在应用关闭和所有其他情况下有效。只有当您清除数据时它可能会失败。希望它有效:)

      【讨论】:

        【解决方案4】:

        鉴于有一个特定的时间间隔开始结束日期,我可以 只需检查当前时间并查看状态 按钮应该是。但是,用户可以简单地输入手机的日期 15 分钟后返回,因此该按钮将继续启用。

        为避免这种情况,请设置AlarmManager

        因为用户可能会重启设备或关闭应用程序

        一旦设置,关闭应用程序不会对 AlarmManager 产生任何影响。但是,重新启动可以。也有重新创建 AlarmManager 的ways。简而言之,您必须再次创建 AlarmManager。但它没有任何关于它之前设定的时间的线索。实现此目的的一种方法是将时间存储在共享首选项中,同时设置 AlarmManager。现在您可以根据需要多次触发 AlarmManager,因为您知道目标时间。

        一旦 AlarmManager 触发,只需从 Pending Intent 提供的 Activity/Service 中启用/禁用相关按钮即可。

        【讨论】:

          【解决方案5】:

          正常情况

          • 按钮可见
            1. 在共享首选项中保存时间戳和时区信息
            2. 启动AlarmManager,它将唤醒并清除共享首选项并禁用按钮状态。

          案例,当用户关闭并打开应用时

          • 按钮可见
            1. 之前的所有步骤以及每次打开应用时都会检查共享首选项中的值(如果有)与当前时间之间的差异,具体取决于按钮显示的情况。

          用户更改时间的情况

          • 按钮可见
            1. 之前的所有步骤以及在AndroidManifest (see how) 中注册时间更改事件并对SharedPreferences 执行必要的操作,具体取决于时间更改了多少。

          显然,如果用户清除应用程序的数据,这种技术是没用的,你必须执行与后端同步(Firebase Database 可能??)。

          【讨论】:

            【解决方案6】:

            使用System.currentTimeMillis() 保存在首选项中的开始时间,每次检查当前时间(相同的System.currentTimeMillis())是否已超过 30 分钟。

            【讨论】:

              【解决方案7】:

              使用以下代码禁用按钮 30 分钟。 btn.setEnabled(false);

              新线程(new Runnable() {

                      @Override
                      public void run() {
                          try {
                              Thread.sleep(1800000);
                          } catch (InterruptedException e) {
                              // TODO Auto-generated catch block
                              e.printStackTrace();
                          }
              
                          LoginActivity.this.runOnUiThread(new Runnable() {
              
                              @Override
                              public void run() {
                                  btn.setEnabled(true);
              
                              }
                          });
                      }
                  }).start();
              

              【讨论】:

                【解决方案8】:

                按钮的 OnClick 将当前时间存储在 sharedPreference 中。 当你回来检查当前时间和 sharedPref 时间之间的差异。 如果超过 30 分钟,则启用,否则禁用。 对于第一个 sharedPreference 值当时为 null 的启用按钮

                【讨论】:

                  【解决方案9】:

                  我会通过以下方式解决这个问题:

                  1. 启用按钮时,将当前时间存储在后端(以及设备的一些标识符)
                  2. 下次显示此活动时,从数据库中读取
                  3. 比较存储的时间和当前时间。
                  4. 确定按钮是否应启用的简单条件。

                  【讨论】:

                    猜你喜欢
                    • 2017-01-18
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-11-19
                    • 2013-04-16
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多