【问题标题】:Get crashed every time while sending values from a fragment in an activity using SharedPreference?每次使用 SharedPreference 从活动中的片段发送值时都会崩溃?
【发布时间】:2017-11-03 06:42:34
【问题描述】:

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

我在使用 Sharedpreference 从活动中的片段获取数据时总是出错。

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

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 将数据放入片段中的代码:

@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)

【问题讨论】:

  • 它会给出未找到视图的错误。威胁您有不在您的布局中的参考视图 ID 检查您的布局。如果你添加布局那么更好理解。
  • 检查你的活动布局 R.id.fragment_container 是否存在
  • 我检查了我的布局没有任何问题,在活动主布局中我创建了一个框架布局并用片段_container命名。它适用于其他片段及其布局,但不适用于活动。

标签: java android android-fragments android-activity sharedpreferences


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    根据您提供的日志,错误是您正在尝试访问当前活动或片段布局中不存在的某些视图。

    视图不存在,或者您传递了错误的视图 ID 来访问它。

    【讨论】:

      【解决方案3】:

      我认为这可能适用于三种可能性。独立尝试其中三种

      1.对于所有的 Fragments 变化 getFragmentManager() 到 getChildFragmentManager()

      1. 为您的活动删除 setContentView,因为您正在使用 .replace

      2. FrameLayout 用于替换的片段活动。

      【讨论】:

        【解决方案4】:

        伙计,你正在初始化按钮并调用它的 setOnclicklistner 方法,因为我从你的代码中得到,你错了。在此之前:

        view.findViewById(R.id.bt_rsignup).setOnClickListener(new View.OnClickListener()
        

        添加这一行:

        Button btnSignUp = (Button) view.findViewById(R.id.bt_rsignup);
        

        在那之后而不是这个:

        view.findViewById(R.id.bt_rsignup).setOnClickListener(new View.OnClickListener()
        

        这样写:

        btnSignup.setOnClickListener(new View.OnClickListener()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-22
          • 1970-01-01
          • 2015-12-29
          • 2023-03-18
          相关资源
          最近更新 更多