Java 如何在应用程序关闭时临时禁用按钮?
所以我创建了一个简单的登录活动。当用户登录3次失败时,登录按钮将被禁用一段时间 我的挣扎是当我关闭应用程序并再次打开它时,按钮被重新启用。如何解决这个问题 这是我的密码: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
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)
。这样,共享首选项标志和按钮状态将同步。换句话说,无论何时启用或禁用按钮,更新共享首选项以匹配。