即使应用程序关闭,我如何临时禁用按钮?
问题描述:
所以我创建了一个简单的登录活动。当用户登录失败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();
}
}
});
}
}
答
使用共享偏好,保存按钮的状态login.setEnabled(false)
后:
SharedPreferences prefs = this.getSharedPreferences("MyApp", Context.MODE_PRIVATE);
boolean enabled = login.isEnabled();
prefs.edit().putBoolean("LOGIN_ENABLED_KEY", enabled).apply();
就在onCreate
得到login
按钮暂停状态之后,检查此值的存在(使用true
为默认值) :
SharedPreferences prefs = this.getSharedPreferences("MyApp", Context.MODE_PRIVATE);
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);
}
当经过计时器:
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();
}
}
});
}
(这里显然有一些重构的空间,但这是有效的。)
答
为了得到这个信息,即使该应用程序重新启动,你需要保存的时间时,按钮将被重新启用。当您的应用程序启动时,您可以打开这些信息,并检查它是在此之前还是之后。
有几种方法,你怎么可以存储在Android上的信息:
- 共享偏好:https://developer.android.com/training/basics/data-storage/shared-preferences.html
- SQLite数据库:https://developer.android.com/training/basics/data-storage/databases.html
- 另存为文件:https://developer.android.com/training/basics/data-storage/files.html
为了您的问题我建议你应该使用Shared Preferences。
这当然会禁用按钮,但仍然存在问题。 即使时间流逝,按钮也不会回到启用模式。 –
请参阅编辑 - 您只需要保持“true”而不是“false”,或者只需重置您的共享首选项,以便下次绕过它时使用后备('true')值。 –
我仍然不太喜欢共享首选项。请问我应该在哪一行放置该代码? –