2014-01-27 41 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