2017-02-06 16 views
1

こんにちは私はユーザーのログイン画面を使用しています。その中で私は共有の設定を使ってユーザの詳細を保存し、ユーザがログインしているかどうかを保存しています。私はスプラッシュ画面を使用しています。そのスプラッシュアクティビティでは、sharedpreferenceの値をチェックしてユーザーが既にログインしているかどうかを確認しました。ユーザーがログインした後、スプラッシュ後にダッシュボードに移動します。しかし、私はNULLポインターerror.please私を助けています。共有環境設定から値を取得し、それを使用してチェックする方法

マイ共有prefrenceクラスは次のとおりです。

public class Userloginsession { 

    public static final String IS_User_login = "isuserloggedin"; 
    // {"did":"1","drivername":"arul ji","dusername":"PIKDRIVER01","logid":"79"} 
    //Driver Login details 
    //From DRIVER 
    public static final String IS_SNO = "sno"; 
    public static final String IS_USERNAME = "userloginname"; 
    public static final String IS_USERPASSWORD = "userloginpassword"; 
    // 
    public static final String IS_EMP_ID = "emp_id"; 
    // 
    //From Json Driver 
    public static final String IS_FIRST_NAME = "first_name"; 
    public static final String IS_LAST_NAME = "last_name"; 
    public static final String IS_IMAGE = "image"; 

    static SharedPreferences user_details; 
    // Editor Reference for sharedpref 
    SharedPreferences.Editor user_details_editor; 

    public Userloginsession(final Context applicationContext) { 

     // create sharedpreff file "driverSession" for DRIVERLOGINACTIVITY 
     user_details = applicationContext.getSharedPreferences("usersession",0); 

     //Edit pfeff file 
     user_details_editor = user_details.edit(); 
     user_details_editor.apply(); 


    } 
    public static boolean isuserLoggedIn() { 
     return user_details.getBoolean(IS_User_login, false); 
    } 
    public void createuserLogin(String passwordp, String username, String SNO, final String EMP_ID, final String FIRST_NAME, final String LAST_NAME, final String Image) { 
     user_details_editor.putBoolean(IS_User_login, true); 
     user_details_editor.putString(IS_USERNAME, username); 
     user_details_editor.putString(IS_USERPASSWORD, passwordp); 
     user_details_editor.putString(IS_SNO, SNO); 
     user_details_editor.putString(IS_EMP_ID, EMP_ID); 
     user_details_editor.putString(IS_FIRST_NAME, FIRST_NAME); 
     user_details_editor.putString(IS_LAST_NAME, LAST_NAME); 
     user_details_editor.putString(IS_IMAGE, Image); 
     user_details_editor.commit(); 
    } 

    public HashMap<String, String> isGetuserDetails() { 
     // Use hashmap to store user credentials 
     final HashMap<String, String> userdetailsmap = new HashMap<>(); 

     // Driv pass 
     userdetailsmap.put(IS_USERNAME, user_details.getString(IS_USERNAME, null)); // Driv Pass 

     // Driver user name 
     userdetailsmap.put(IS_USERPASSWORD, user_details.getString(IS_USERPASSWORD, null)); 

     // Driver ID 
     userdetailsmap.put(IS_SNO, user_details.getString(IS_SNO, null)); 

     //Driver Name 
     userdetailsmap.put(IS_EMP_ID, user_details.getString(IS_EMP_ID, null)); 
     userdetailsmap.put(IS_FIRST_NAME, user_details.getString(IS_FIRST_NAME, null)); 
     userdetailsmap.put(IS_LAST_NAME, user_details.getString(IS_LAST_NAME, null)); 
     userdetailsmap.put(IS_IMAGE, user_details.getString(IS_IMAGE, null)); 

     return userdetailsmap; 
    } 

    public void clearAllvalues() { 

     user_details_editor = user_details.edit(); 
     user_details_editor.clear(); 
     user_details_editor.apply(); 

    } 


} 

私のスプラッシュスクリーンのactictyは次のとおりです。

public class Splashscreen extends AppCompatActivity { 
    private static int SPLASH_TIME_OUT = 3000; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_splashscreen2); 

     new Handler().postDelayed(new Runnable() { 

      /* 
      * Showing splash screen with a timer. This will be useful when you 
      * want to show case your app logo/company 
      */ 

      @Override 
      public void run() { 
       // This method will be executed once the timer is over 
       // Start your app main activity 

        if (Userloginsession.isuserLoggedIn()) { 
//      startActivity(new Intent(MainActivity.this, RideHistry.class)); 
         startActivity(new Intent(Splashscreen.this, Dashboard.class)); 
        /*overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_right);*/ 
         finish(); 


        } else { 
         // if driver not login go to DriverLogin Activity 
         startActivity(new Intent(Splashscreen.this, MainActivity.class)); 

         finish(); 
        } 
       /*} else { 
        startActivity(new Intent(Splashscreen.this, MainActivity.class)); 

        finish(); 
       }*/ 
      } 
     }, SPLASH_TIME_OUT); 
    } 
} 

私のエラーは、次のとおりです。

 Process: com.example.notebook.dptextiles, PID: 214 java.lang.NullPointerException: 
    Attempt to invoke interface method 'boolean android.content.SharedPreferences.getBoolean(java.lang.String, boolean)' on a null object reference 
    at com.example.notebook.dptextiles.fragments.Userloginsession.isuserLoggedIn(Userloginsession.java:45 
    at com.example.notebook.dptextiles.Splashscreen$1.run(Splashscreen at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5441) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628) 

答えて

2

あなたはこの

Userloginsession login=new Userloginsession(getApplicationContext()); 
if (login.isuserLoggedIn()) 

問題、あなたはsharedpreferenceを初期化していないですようにそれを使用Userloginsession.isuserLoggedIn()直接 を使用しています。つまりUserloginsessionは初期化されません。そのためには、活動の文脈を与える必要があります。あなたのスプラッシュ活動における

全体的なクラスを使用すると、user_details共有好みがnull

public class Splashscreen extends AppCompatActivity { 
    private static int SPLASH_TIME_OUT = 3000; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_splashscreen2); 
     Userloginsession login=new Userloginsession(getApplicationContext()); 
     new Handler().postDelayed(new Runnable() { 

      /* 
      * Showing splash screen with a timer. This will be useful when you 
      * want to show case your app logo/company 
      */ 

      @Override 
      public void run() { 
       // This method will be executed once the timer is over 
       // Start your app main activity 

        if (login.isuserLoggedIn()) { 
//      startActivity(new Intent(MainActivity.this, RideHistry.class)); 
         startActivity(new Intent(Splashscreen.this, Dashboard.class)); 
        /*overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_right);*/ 
         finish(); 


        } else { 
         // if driver not login go to DriverLogin Activity 
         startActivity(new Intent(Splashscreen.this, MainActivity.class)); 

         finish(); 
        } 
       /*} else { 
        startActivity(new Intent(Splashscreen.this, MainActivity.class)); 

        finish(); 
       }*/ 
      } 
     }, SPLASH_TIME_OUT); 
    } 
} 
+0

@thankのyou..its ... – lucky

+0

@運がよければ正しい答えとしてマークする必要があります –

+0

@ sry..iこれは新しいものです..i upvoted bt dnt knwこのマークは...それをマークしました – lucky

2

クエリの前に共有設定が初期化されていることを確認してください。ブレークポイントを入れてデバッグします。

2

する必要があります。..

はそれが好きで初期化します。

Userloginsession session = new Userloginsession(Splashscreen.this); 
if (session.isuserLoggedIn()) { 
+0

@thank you..nowその仕事... – lucky

0

まず作成別のプリファレンスクラス

PrefManager.java

package name; 

import android.content.Context; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 

import java.util.HashMap; 

/** 
* Created by Ravi on 08/07/15. 
*/ 
public class PrefManager { 
    // Shared Preferences 
    SharedPreferences pref; 

    // Editor for Shared preferences 
    Editor editor; 

    // Context 
    Context _context; 

    // Shared pref mode 
    int PRIVATE_MODE = 0; 

    // Shared preferences file name 
    private static final String PREF_NAME = "MegaInfomatix"; 

    // All Shared Preferences Keys 
    private static final String KEY_IS_WAITING_FOR_SMS = "IsWaitingForSms"; 
    private static final String KEY_MOBILE_NUMBER = "mobile_number"; 
    private static final String KEY_IS_LOGGED_IN = "isLoggedIn"; 
    private static final String KEY_NAME = "name"; 
    private static final String KEY_EMAIL = "email"; 
    private static final String KEY_MOBILE = "mobile"; 

    public PrefManager(Context context) { 
     this._context = context; 
     pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE); 
     editor = pref.edit(); 
    } 

    public void setIsWaitingForSms(boolean isWaiting) { 
     editor.putBoolean(KEY_IS_WAITING_FOR_SMS, isWaiting); 
     editor.commit(); 
    } 

    public boolean isWaitingForSms() { 
     return pref.getBoolean(KEY_IS_WAITING_FOR_SMS, false); 
    } 

    public void setMobileNumber(String mobileNumber) { 
     editor.putString(KEY_MOBILE_NUMBER, mobileNumber); 
     editor.commit(); 
    } 

    public String getMobileNumber() { 
     return pref.getString(KEY_MOBILE_NUMBER, null); 
    } 

    public void createLogin(String name, String email, String mobile) { 
     editor.putString(KEY_NAME, name); 
     editor.putString(KEY_EMAIL, email); 
     editor.putString(KEY_MOBILE, mobile); 
     editor.putBoolean(KEY_IS_LOGGED_IN, true); 
     editor.commit(); 
    } 

    public boolean isLoggedIn() { 
     return pref.getBoolean(KEY_IS_LOGGED_IN, false); 
    } 

    public void clearSession() { 
     editor.clear(); 
     editor.commit(); 
    } 

    public HashMap<String, String> getUserDetails() { 
     HashMap<String, String> profile = new HashMap<>(); 
     profile.put("name", pref.getString(KEY_NAME, null)); 
     profile.put("email", pref.getString(KEY_EMAIL, null)); 
     profile.put("mobile", pref.getString(KEY_MOBILE, null)); 
     return profile; 
    } 
} 

のonCreateメソッドの前に が優先クラスのオブジェクトを作成しLoginActivityクラスにとのonCreateメソッドでこれを行う、今取り組んで

Preference pref; 
pref = new PrefManager(this); 

if (pref.isLoggedIn()) { 
      Intent intent = new Intent(SmsActivity.this, MainActivity.class); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      startActivity(intent); 

      finish(); 
     } 
+0

あなたはsharedpreferenceの値に基づいてアクティビティをスキップしています – SamH67

+0

他の場所からコードをコピーしないでください。問題に詳細な解決策を与えてください。 –

+0

@AjayShresthaあなたはログイン画面をワンタイムにしたかったので、コードに合わせて変更することができました。 TY – SamH67

関連する問題