2017-07-04 16 views
2

私はログイン用の共有環境設定を使用しているアンドロイドアプリを持っています。今はユーザーログインのようなフローがあります。ログインが成功すると、認証情報が保存されます。ユーザーは再びアプリケーションを開き、ユーザー名のパスワードが編集テキストに表示されます。ログインボタンがあり、ログインして内部アクティビティにジャンプするためのsetonclicklistnerがあります。 ユーザーが正常にログインしたときのようなフローを試みています。アプリが再起動され、資格情報が保存されます。自動的に次のアクティビティ(内部アクティビティ)に移動します。 私は次のアクティビティを開き、OnCreateのonclicklistnerで今..ログインページ共有設定が正常に動作しません

までしようとしていると、資格情報が良好であれば

buttonlogin.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       if(etemail.getText().toString().equals("") && etpass.getText().toString().equals("")) 
       { 
        Toast.makeText(getApplicationContext(),"Enter your username and Password",Toast.LENGTH_LONG).show(); 
       } 
       else 
       { 
        load_data(); 
       } 

      } 
     }); 

共有県のコード

private void savePreferences() { 
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 
      Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = settings.edit(); 

    // Edit and commit 
    UnameValue = etemail.getText().toString(); 
    PasswordValue = etpass.getText().toString(); 
    editor.putString(PREF_UNAME, UnameValue); 
    editor.putString(PREF_PASSWORD, PasswordValue); 
    editor.commit(); 
} 

private void loadPreferences() 
{ 
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 
      Context.MODE_PRIVATE); 

    // Get value 
    UnameValue = settings.getString(PREF_UNAME, DefaultUnameValue); 
    PasswordValue = settings.getString(PREF_PASSWORD, DefaultPasswordValue); 

    etemail.setText(UnameValue); 
    etpass.setText(PasswordValue); 
} 

私は何をすべきこれを達成するために行うのですか?ユーザー名パスワードが自動的に保存される場合、ログインボタンをクリックするのではなく、次のアクティビティを開きますか? ありがとう

+0

のようなのonCreateメソッドでチェックしていませんか? – Pelocho

+0

SharedPreferencesを使用していたのは、私のマネージャーから与えられたToDoです。:)何もできませんでした – Akshay

答えて

2

あなたはログインあれば はloadPreferences()

に行うことができるSharedPreferencesクラスでcontains(String key)を使用することができますボタンのクリックをシミュレートする必要はありませんが、クリックが提供されたユーザー名/パスワードに基づいて他のデータをロードする場合は、ButtonクラスのperformClick()を使用して行う必要があります。

ので、あなたのコードは次のようになります。

private void loadPreferences() 
{ 
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 
      Context.MODE_PRIVATE); 

    if(settings.contains(PREF_UNAME) && settings.contains(PREF_PASSWORD)){ 
     //you can start the 2nd activity directly here 
     //Intent intent = new Intent (...) 
     //startActivity(intent); 
     //finish(); 

     //OR 

     //load data into edittexts and programatically click the login button 
     UnameValue = settings.getString(PREF_UNAME, DefaultUnameValue); 
     PasswordValue = settings.getString(PREF_PASSWORD, DefaultPasswordValue); 

     etemail.setText(UnameValue); 
     etpass.setText(PasswordValue); 

     //here it will click the button as if the user did it. 
     btnLogin.performClick(); 
    }//contains 
} 

サイドノート:それは保存した後

+0

Sounds useful ..ログインボタンは、資格があれば、次のアクティビティは何も表示されません。 – Akshay

+0

@Akshay正しいと思いますが、ユーザ名/パスワードが保存されていても、次のアクティビティを開始する前にチェックしてくださいあなたがパスワードを変更した場合は、将来のバグなどがあります。もっと良いアプローチは 'performClick()'を使うことです。 – Yazan

+1

またこれは最大4-5人で使用されるテストアプリです資格情報の保管に関する問題...とにかく感謝の仲間はそれを働かせました – Akshay

0

最初に次のアクティビティーを開き、onCreateメソッドでユーザーがログインしているかどうかを確認します。最初にクローズしていない場合は、logginアクティビティを開きます。

MainActivity.java

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
session = new SessionManager(getApplicationContext()); 
     CheckLogin(); 
... 
} 
private void CheckLogin(){ 
     if(session.checkLogin()){finish();} 
    } 

SessionManager.java

public boolean checkLogin(){ 
     // Check login status 
     if(!this.isUserLoggedIn()){ 

      // user is not logged in redirect him to Login Activity 
      Intent i = new Intent(_context, LoginActivity.class); 

      // Closing all the Activities from stack 
      i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

      // Add new Flag to start new Activity 
      i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

      // Staring Login Activity 
      _context.startActivity(i); 

      return true; 
     } 
     return false; 
    } 
0

を暗号化されていない、特別なプレーンテキストSharedPreferencesでパスワードを保存するために(安全ではありません)良い習慣ではありませんユーザー名とパスワードsharedpreference editor.putBoolean("hasLoggedin", true);

におけるだから、

ようにする必要があります

その後、 `AccountManager`を` SharedPreferences`を使用して、なぜ

boolean hasLoggedin = sp.getBoolean("hasLoggedin", false); 
      if (hasLoggedin) { 
       Intent intent = new Intent(LoginActivity.this, HomeActivity.class); 
       startActivity(intent); 
       finish(); 
} 
関連する問題