2014-01-27 40 views
0

我想使用共享首選項創建userlogin詳細信息。使用共享首選項的登錄對話框

當我加載應用程序,並點擊登錄按鈕, 會彈出一個登錄對話框。 我輸入後,它會向用戶敬酒,例如welcome [用戶名]。 當用戶再次登錄時,它會將一條消息歡迎回來[用戶名]。用戶不必再次輸入他/她的名字進入應用程序。 事實上,當用戶點擊登錄時,它會敬酒回來[用戶名],他/她可以繼續申請。

但是,我的代碼中有 ,只要我選擇登錄,我必須輸入用戶名。 即使我再次登錄,我仍然需要輸入用戶名。

有人可以引導我與我的代碼?

的logcat:

01-27 18:04:00.266: E/AndroidRuntime(4287): FATAL EXCEPTION: main 
01-27 18:04:00.266: E/AndroidRuntime(4287): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.fuellogproject/com.example.fuellogproject.homeActivity}: java.lang.NullPointerException 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2034) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at android.app.ActivityThread.access$700(ActivityThread.java:140) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at android.os.Looper.loop(Looper.java:137) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at android.app.ActivityThread.main(ActivityThread.java:4921) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at java.lang.reflect.Method.invoke(Method.java:511) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at dalvik.system.NativeStart.main(Native Method) 
01-27 18:04:00.266: E/AndroidRuntime(4287): Caused by: java.lang.NullPointerException 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:160) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:366) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at com.example.fuellogproject.homeActivity.<init>(homeActivity.java:19) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at java.lang.Class.newInstanceImpl(Native Method) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at java.lang.Class.newInstance(Class.java:1319) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at android.app.Instrumentation.newActivity(Instrumentation.java:1068) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2025) 
01-27 18:04:00.266: E/AndroidRuntime(4287):  ... 11 more 

這是我的代碼

public void CheckUser(View v) { 
    final Dialog dialog = new Dialog(homeActivity.this); 
    dialog.setContentView(R.layout.login); 
    dialog.setTitle("Login"); 
    final EditText editTextUserName = (EditText) dialog 
     .findViewById(R.id.nameEditText); 
    Button btnLogIn = (Button) dialog.findViewById(R.id.loginBTN); 
    // get The User name and Password 
    String userName = editTextUserName.getText().toString(); 
    if (access_token != null) { 
     SharedPreferences.Editor editor = prefs.edit(); 
     editor.putString("username", userName); 
     editor.commit(); 
     String getUser = prefs.getString("username", userName); 
     Toast.makeText(homeActivity.this, "Welcome," + getUser, 
      Toast.LENGTH_LONG).show(); 
     dialog.dismiss(); 
     Intent mainact = new Intent(getApplicationContext(), 
      MainActivity.class); 
     startActivity(mainact); 
    } else { 
     Toast.makeText(homeActivity.this, "Welcome back," + userName, 
      Toast.LENGTH_LONG).show(); 
     Intent mainact = new Intent(getApplicationContext(), 
      MainActivity.class); 
     startActivity(mainact); 
    } 
    // get the Refferences of views 
    // Set On ClickListener 
    btnLogIn.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      SharedPreferences.Editor editor = prefs.edit(); 
      editor.putString("access_token", "<save value>"); 
      editor.commit(); 
     } 
    }); 
    dialog.show(); 
} 
+0

什麼是引發NPE的homeActivity.java:19'? –

回答

3

試試這個現在

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
String access_token = preferences.getString("username", null); 

    if(access_token!=null){ 
    showMain(); //inside show main you write your logic for toast, redirect to the desired view 
    } 

如果用戶名存在於共享偏好,那麼它會去到你的設計其他紅色活動,您還可以顯示LoginActivity,並把下面的代碼在你的登錄按鈕的點擊收聽

SharedPreferences.Editor editor = preferences.edit();  
editor.putString("access_token","<save value>"); 
editor.commit(); 
+0

我編輯過了,你是這個意思? 有人說SharedPrefrences必須是最後的 – Chloe

+0

@chloe,聲明'SharedPreference作爲私人變量外的onCreateView(..)'並初始化它的方法,然後我不會要求'最後' – NarendraSoni

+0

我剛剛編輯我的問題/我有一個強制關閉錯誤 – Chloe

0

看來你閱讀和共享偏好寫入/時有不同的密鑰:

editor.putString("user_name", userName); 

String getUser = prefs.getString("username", userName); 
在特別

,鑰匙User_nameuserename

0
1. Use the same string to save and retrieve values... 
    "editor.putString("user_name", userName); 
            editor.commit(); 
            String getUser = prefs.getString("username".." 
    "user_name" while putString and "username" while getString 

    2. Where are you retrieving the sharedPref value? it has to be without checking the edittext value if you want the user to log in without typing his/her name. 
i.e. String getUser = prefs.getString("username", userName); -with a null check when user clicks login