我不知道我的代码有什么问题
这是我的片段课
package com.example.gandi.symanlub; /** * A simple {@link Fragment} subclass. */ public class Reminder extends Fragment { Button btnubah, btnkeluar; SessionManager session; View rootview; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment rootview = inflater.inflate(R.layout.fragment_reminder, container, false); btnkeluar = (Button)rootview.findViewById(R.id.btnlogout); btnkeluar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { session.logoutUser(); } }); return rootview; } }
这是我的SessionManager.java
package com.example.gandi.symanlub; @SuppressLint("CommitPrefEdits") public class SessionManager { // Shared Preferences SharedPreferences pref; // Editor for Shared preferences SharedPreferences.Editor editor; // Context Context _context; // Shared pref mode int PRIVATE_MODE = 0; // nama sharepreference private static final String PREF_NAME = "Sesi"; // All Shared Preferences Keys private static final String IS_LOGIN = "IsLoggedIn"; public static final String KEY_EMAIL = "email"; public static final String KEY_PASS = "pass"; // Constructor public SessionManager(Context context){ this._context = context; pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE); editor = pref.edit(); } /** * Create login session * */ public void createLoginSession(String email, String pass){ // Storing login value as TRUE editor.putBoolean(IS_LOGIN, true); editor.putString(KEY_EMAIL, email); editor.putString(KEY_PASS, pass); editor.commit(); } /** * Check login method wil check user login status * If false it will redirect user to login page * Else won't do anything * */ public void checkLogin(){ // Check login status if(!this.isLoggedIn()){ Intent i = new Intent(_context, Login.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); _context.startActivity(i); //((Activity)_context).finish(); } } /** * Get stored session data * */ public HashMap<String, String> getUserDetails(){ HashMap<String, String> user = new HashMap<String, String>(); user.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null)); user.put(KEY_PASS, pref.getString(KEY_PASS, null)); return user; } /** * Clear session details * */ public void logoutUser(){ editor.clear(); editor.commit(); } public void hapussesi(){ editor.clear(); editor.commit(); } public boolean isLoggedIn(){ return pref.getBoolean(IS_LOGIN, false); } }
运行项目时出现的错误:
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ void com.example.gandi.symanlub.SessionManager.logoutUser()”
您收到错误消息是因为在此行您正在调用:
session.logoutUser();
会话为空,因为它没有在任何地方初始化。您需要在使用前添加一行以对其进行初始化(可以在onCreateView,或onAttach您认为合适的任何地方进行该操作):
onCreateView
onAttach
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { session = new SessionManager(getActivity());
getActivity用于将a传递Context给构造函数,因为我看到它采用了该参数。
getActivity
Context