2017-10-10 3 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

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

編集を参照してください。ちょうど 'false'の代わりに' true'を使うか、共有環境設定をリセットして次回はフォールバック( 'true')値を使うようにしてください。 –

+0

私はまだ共有設定に慣れていません。私はそのコードをどの行に書かなければならないのでしょうか? –

2

この情報を取得するには、アプリを再起動した場合でも、あなたはボタンが再び有効になり、時間を節約する必要があります。あなたのアプリが起動すると、この情報を開いて、その前か後かを確認することができます。

あなたがAndroid上の情報を保存することができますどのようにいくつかの方法、あります

https://developer.android.com/training/basics/data-storage/databases.html

  • 保存ファイルとしては、問題私は、共有環境設定を使用することをお勧めします。

    SharedPreferences prefs = this.getSharedPreferences("MyApp", Context.MODE_PRIVATE); 
    boolean enabled = login.isEnabled(); 
    prefs.edit().putBoolean("LOGIN_ENABLED_KEY", enabled).apply(); 
    

    だけonCreateloginボタンのホールドを取得した後、(デフォルト値としてtrueを使用して)この値が存在するかどうかをチェック:login.setEnabled(false)後に、ボタンの状態を保存し、共有設定を使用して

  • 関連する問題