java - 每次使用 SharedPreference 从 Activity 中的 fragment 发送值时都会崩溃?

标签 java android android-fragments android-activity sharedpreferences

我是 android 新手,对从 fragment 获取数据到 Activity 的知识一无所知。我有一个 Activity 和三个名为 loginFragment、signUpFragment 和 homeFragment 的 fragment 。 我想做一些事情,就像我在这个应用程序中注册(在signUpFragment中)然后使用注册详细信息登录并进一步转到homeFrament一样,HomeFragment有一个注销按钮,可以清除共享首选项数据并再次发送回登录屏幕。 当应用程序打开时,从 loginFragment 开始,如果我不注销,则应用程序将以 HomeFragment 打开。

使用 Sharedpreference 从 Activity 中的 fragment 获取数据时,我总是遇到错误。

我在 Activity 中获取共享偏好值的代码:

SharedPreferences preferences = getApplicationContext().getSharedPreferences("pref",MODE_PRIVATE);
final String email = preferences.getString("email", "Empty");
final String password = preferences.getString("password", "Empty");

final LoginFragment login = new LoginFragment();
final HomeFragment home = new HomeFragment();

if (email == "Empty" && password == "Empty" ) {
                getFragmentManager().beginTransaction()
                        .replace(R.id.fragment_container, login).commit();


            }else {
                getFragmentManager().beginTransaction()
                        .add(R.id.fragment_container, home).commit();


            }

            startActivity(new Intent(Splash.this,MainActivity.class));
            finish(); 

我使用sharedprefrence将数据放入 fragment 的代码:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_sign_up, container, false);

    final EditText et_username = view.findViewById(R.id.et_username);
    final EditText et_remail = view.findViewById(R.id.et_remail);
    final EditText et_rpass = view.findViewById(R.id.et_rpass);
    final EditText et_rcpass = view.findViewById(R.id.et_rcpass);
    final EditText et_phone = view.findViewById(R.id.et_phone);

    preference = getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);
    editor = preference.edit();

    view.findViewById(R.id.bt_rsignup).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (LoginFragment.isEmpty(et_username)){
                et_username.setError("Enter user name");
                et_username.requestFocus();
            } else if (LoginFragment.isEmpty(et_remail)) {
                et_remail.setError("Enter email address");
                et_remail.requestFocus();
            } else if (!isEmailValid(et_remail.getText().toString().trim())) {
                et_remail.setError("Enter valid email address");
                et_remail.requestFocus();
            } else if (LoginFragment.isEmpty(et_rpass)){
                et_rpass.setError("Enter password");
                et_rpass.requestFocus();
            } else if (LoginFragment.isEmpty(et_rcpass)) {
                et_rcpass.setError("Repeat password be confirmed");
                et_rcpass.requestFocus();
            } else if (!et_rpass.getText().toString().trim().equals(et_rcpass.getText().toString().trim())) {
                et_rcpass.setError("Password mismatch");
                et_rcpass.requestFocus();
            } else if (LoginFragment.isEmpty(et_phone)){
                et_phone.setError("Enter phone number");
                et_phone.requestFocus();
            } else {
                editor.putString("user_name",et_username.getText().toString());
                editor.putString("email",et_remail.getText().toString().trim());
                editor.putString("password",et_rpass.getText().toString().trim());
                editor.putString("cpassword",et_rcpass.getText().toString().trim());
                editor.putString("phone",et_phone.getText().toString().trim());
                editor.commit();

                FragmentManager fragmentManager = getFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                LoginFragment loginFragment = new LoginFragment();
                fragmentTransaction.add(R.id.fragment_container, loginFragment);
                fragmentTransaction.commit();
            }
        }
    });
    return view;

我在 logcat 中收到此错误:

java.lang.IllegalArgumentException: No view found for id 0x7f0b005e (com.danish.test3:id/fragment_container) for fragment LoginFragment{52802074 #0 id=0x7f0b005e}
                                                                  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:882)
                                                                  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
                                                                  at android.app.BackStackRecord.run(BackStackRecord.java:684)
                                                                  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
                                                                  at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
                                                                  at android.os.Handler.handleCallback(Handler.java:733)
                                                                  at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                  at android.os.Looper.loop(Looper.java:136)
                                                                  at android.app.ActivityThread.main(ActivityThread.java:5001)
                                                                  at java.lang.reflect.Method.invokeNative(Native Method)
                                                                  at java.lang.reflect.Method.invoke(Method.java:515)
                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
                                                                  at dalvik.system.NativeStart.main(Native Method)

最佳答案

我不会使用共享首选项在 fragment 与其 Activity 之间传递数据。在fragment内部定义一个接口(interface),让Activity实现该接口(interface)

关于java - 每次使用 SharedPreference 从 Activity 中的 fragment 发送值时都会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47089900/

相关文章:

java - Liferay : how can i upload a image from portlet preferences?

java - 了解外部类文件夹

java - 记录针对 MySQL 数据库的长时间运行的查询?

android - 带标签的 ActionBarSherlock

java - 检查用户是否已存在于 firebase 实时数据库中

android - 如何在 iOS 和 Android 上翻译应用程序?这在经济上是否值得?

java - javac -version 显示什么?

android - 无法访问 PopupWindow 布局中的资源,对象引用为空

java - 从 fragment 中的 Activity 调用方法

android - 弹出 fragment 后堆栈后打开抽屉导航