2017-10-10 41 views
0

所以我創建了一個簡單的登錄活動。當用戶登錄失敗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(); 
      } 
     } 
    }); 
} 

}

回答

0

使用共享偏好,保存按鈕的狀態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(); 
      } 
     } 
    }); 
} 

(這裏顯然有一些重構的空間,但這是有效的。)

+0

這當然會禁用按鈕,但仍然存在問題。 即使時間流逝,按鈕也不會回到啓用模式。 –

+0

請參閱編輯 - 您只需要保持「true」而不是「false」,或者只需重置您的共享首選項,以便下次繞過它時使用後備('true')值。 –

+0

我仍然不太喜歡共享首選項。請問我應該在哪一行放置該代碼? –

2

爲了得到這個信息,即使該應用程序重新啓動,你需要保存的時間時,按鈕將被重新啓用。當您的應用程序啓動時,您可以打開這些信息,並檢查它是在此之前還是之後。

有幾種方法,你怎麼可以存儲在Android上的信息:

爲了您的問題我建議你應該使用Shared Preferences。

相關問題