我是 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/