Java 如何在应用程序关闭时临时禁用按钮?

Java 如何在应用程序关闭时临时禁用按钮?,java,android,Java,Android,所以我创建了一个简单的登录活动。当用户登录3次失败时,登录按钮将被禁用一段时间 我的挣扎是当我关闭应用程序并再次打开它时,按钮被重新启用。如何解决这个问题 这是我的密码: public class LoginControl extends Activity { private DBControl db = new DBControl(this); int counter = 2; Button login = null; @Override protected void onCreate(Bu

所以我创建了一个简单的登录活动。当用户登录3次失败时,登录按钮将被禁用一段时间

我的挣扎是当我关闭应用程序并再次打开它时,按钮被重新启用。如何解决这个问题

这是我的密码:

public class LoginControl extends Activity {
private DBControl db = new DBControl(this);
int counter = 2;
Button login = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.loginview);


    Button register = (Button) findViewById(R.id.btnCreateA);
    login = (Button) findViewById(R.id.btnLogin);
    login.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                EditText a = (EditText) findViewById(R.id.etUser);
                EditText b = (EditText) findViewById(R.id.etPassword);
                String user = a.getText().toString();
                String pass = b.getText().toString();
                String confirm = db.getUserPass(user);
                if (user.equals("") || pass.equals("")) {
                    Toast passed = Toast.makeText(LoginControl.this, "Please input required fields.", Toast.LENGTH_LONG);
                    passed.show();
                } else if (pass.equals(confirm)) {
                    Toast passed = Toast.makeText(LoginControl.this, "Sucess!", Toast.LENGTH_LONG);
                    passed.show();
                    Intent intent = new Intent(LoginControl.this, HomeControl.class).putExtra("Music", false);
                    startActivity(intent);
                    finish();

                } else if (counter == 0)
                // Disable button after 3 failed attempts
                {

                    login.setEnabled(false);

                    Toast alert = Toast.makeText(LoginControl.this, "Login Disabled for 5 mins", Toast.LENGTH_LONG);
                    alert.show();

                    final Handler handler = new Handler();
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            login.setEnabled(true);
                            counter = 2;
                        }
                    }, 30000);
                } else {
                    Toast passed = Toast.makeText(LoginControl.this, "Username or password don't match!", Toast.LENGTH_LONG);
                    counter--;
                    passed.show();
                }
            } catch (Exception e) {
                Toast passed = Toast.makeText(LoginControl.this, e.toString(), Toast.LENGTH_LONG);
                passed.show();
            }
        }
    });
}

}

要获取此信息,即使应用程序重新启动,您也需要节省再次启用按钮的时间。当你的应用程序启动时,你可以打开此信息并检查它是在这段时间之前还是之后

有几种方法可以在android上存储信息:

  • 共享首选项:
  • SQLite数据库:
  • 另存为文件:

对于您的问题,我建议您使用共享首选项。

要获取此信息,即使应用程序重新启动,您也需要节省再次启用按钮的时间。当你的应用程序启动时,你可以打开此信息并检查它是在这段时间之前还是之后

有几种方法可以在android上存储信息:

  • 共享首选项:
  • SQLite数据库:
  • 另存为文件:

对于您的问题,我建议您使用共享首选项。

使用共享首选项,在
登录后保存按钮的状态。setEnabled(false)

在按住
onCreate
中的
login
按钮后,检查是否存在此值(使用
true
作为默认值):

如果此时按钮被禁用,则需要重新启动计时器,以便最终启用:

if (!enabled) {
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            login.setEnabled(true);
            prefs.edit().clear().apply();
            counter = 2;
        }
    }, 30000);
}
计时器过期时:

SharedPreferences prefs = this.getSharedPreferences("MyApp", Context.MODE_PRIVATE);
prefs.edit().putBoolean("LOGIN_ENABLED_KEY", true).apply();
或者,只需清除共享首选项:

SharedPreferences prefs = this.getSharedPreferences("MyApp", Context.MODE_PRIVATE);
prefs.edit().clear().apply();

总而言之,大致如下:

int counter = 2;
Button login = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.loginview);

    final SharedPreferences prefs = this.getSharedPreferences("MyApp", Context.MODE_PRIVATE);
    login = (Button) findViewById(R.id.btnLogin);
    boolean enabled = prefs.getBoolean("LOGIN_ENABLED_KEY", true);
    login.setEnabled(enabled);
    if (!enabled) {
        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                login.setEnabled(true);
                prefs.edit().clear().apply();
                counter = 2;
            }
        }, 30000);
    }

    login.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             try {
                 EditText a = (EditText) findViewById(R.id.etUser);
                 EditText b = (EditText) findViewById(R.id.etPassword);
                 String user = a.getText().toString();
                 String pass = b.getText().toString();
                 if (user.equals("") || pass.equals("")) {
                     Toast passed = Toast.makeText(LoginControl.this, "Please input required fields.", Toast.LENGTH_LONG);
                     passed.show();
                 } else if (pass.equals("pass")) {
                     Toast passed = Toast.makeText(LoginControl.this, "Success!", Toast.LENGTH_LONG);
                     passed.show();
                     // Start HomeControl + finish()
                 } else if (counter == 0) {
                     // Disable button after 3 failed attempts
                     login.setEnabled(false);
                     prefs.edit().putBoolean("LOGIN_ENABLED_KEY", false).apply();
                     Toast alert = Toast.makeText(LoginControl.this, "Login Disabled for 5 mins", Toast.LENGTH_LONG);
                     alert.show();

                     final Handler handler = new Handler();
                     handler.postDelayed(new Runnable() {
                         @Override
                         public void run() {
                             login.setEnabled(true);
                             prefs.edit().clear().apply();
                             counter = 2;
                         }
                     }, 30000);
                 } else {
                     Toast passed = Toast.makeText(LoginControl.this, "Username or password don't match!", Toast.LENGTH_LONG);
                     counter--;
                     passed.show();
                 }
             } catch (Exception e) {
                 Toast passed = Toast.makeText(LoginControl.this, e.toString(), Toast.LENGTH_LONG);
                 passed.show();
             }
         }
    });
}

(这里显然有一些重构的空间,但这确实有效。)

使用共享首选项,在
登录后保存按钮的状态。setEnabled(false)

在按住
onCreate
中的
login
按钮后,检查是否存在此值(使用
true
作为默认值):

如果此时按钮被禁用,则需要重新启动计时器,以便最终启用:

if (!enabled) {
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            login.setEnabled(true);
            prefs.edit().clear().apply();
            counter = 2;
        }
    }, 30000);
}
计时器过期时:

SharedPreferences prefs = this.getSharedPreferences("MyApp", Context.MODE_PRIVATE);
prefs.edit().putBoolean("LOGIN_ENABLED_KEY", true).apply();
或者,只需清除共享首选项:

SharedPreferences prefs = this.getSharedPreferences("MyApp", Context.MODE_PRIVATE);
prefs.edit().clear().apply();

总而言之,大致如下:

int counter = 2;
Button login = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.loginview);

    final SharedPreferences prefs = this.getSharedPreferences("MyApp", Context.MODE_PRIVATE);
    login = (Button) findViewById(R.id.btnLogin);
    boolean enabled = prefs.getBoolean("LOGIN_ENABLED_KEY", true);
    login.setEnabled(enabled);
    if (!enabled) {
        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                login.setEnabled(true);
                prefs.edit().clear().apply();
                counter = 2;
            }
        }, 30000);
    }

    login.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             try {
                 EditText a = (EditText) findViewById(R.id.etUser);
                 EditText b = (EditText) findViewById(R.id.etPassword);
                 String user = a.getText().toString();
                 String pass = b.getText().toString();
                 if (user.equals("") || pass.equals("")) {
                     Toast passed = Toast.makeText(LoginControl.this, "Please input required fields.", Toast.LENGTH_LONG);
                     passed.show();
                 } else if (pass.equals("pass")) {
                     Toast passed = Toast.makeText(LoginControl.this, "Success!", Toast.LENGTH_LONG);
                     passed.show();
                     // Start HomeControl + finish()
                 } else if (counter == 0) {
                     // Disable button after 3 failed attempts
                     login.setEnabled(false);
                     prefs.edit().putBoolean("LOGIN_ENABLED_KEY", false).apply();
                     Toast alert = Toast.makeText(LoginControl.this, "Login Disabled for 5 mins", Toast.LENGTH_LONG);
                     alert.show();

                     final Handler handler = new Handler();
                     handler.postDelayed(new Runnable() {
                         @Override
                         public void run() {
                             login.setEnabled(true);
                             prefs.edit().clear().apply();
                             counter = 2;
                         }
                     }, 30000);
                 } else {
                     Toast passed = Toast.makeText(LoginControl.this, "Username or password don't match!", Toast.LENGTH_LONG);
                     counter--;
                     passed.show();
                 }
             } catch (Exception e) {
                 Toast passed = Toast.makeText(LoginControl.this, e.toString(), Toast.LENGTH_LONG);
                 passed.show();
             }
         }
    });
}

(这里显然有重构的空间,但这确实有效。)

这确实禁用了按钮,但仍然存在一个问题。即使时间已过,按钮也不会返回到启用模式。请参见编辑--您只需要保持
true
而不是
false
,或者简单地重置共享首选项,以便下次使用fallback(
true
)值。我仍然不太熟悉共享首选项。我可以问一下我应该把代码放在哪一行吗?把它放在重新启用登录按钮的旁边,即
login.setEnabled(true)
。这样,共享首选项标志和按钮状态将同步。换句话说,无论何时启用或禁用按钮,都要更新共享首选项以匹配。这当然会禁用按钮,但仍然存在问题。即使时间已过,按钮也不会返回到启用模式。请参见编辑--您只需要保持
true
而不是
false
,或者简单地重置共享首选项,以便下次使用fallback(
true
)值。我仍然不太熟悉共享首选项。我可以问一下我应该把代码放在哪一行吗?把它放在重新启用登录按钮的旁边,即
login.setEnabled(true)
。这样,共享首选项标志和按钮状态将同步。换句话说,无论何时启用或禁用按钮,更新共享首选项以匹配。