在片段旋转中使用 edittext 的 savedInstanceState 不起作用

saveInstanceState with edittext on fragment rotation doesnt´t work

我正在努力让它工作。 我有一个登录片段。现在我想做更好的用户体验。当用户旋转他的设备时,eddittext 字段应该保存值,a.e。邮箱地址。 我阅读了很多关于片段生命周期的教程和许多代码示例,但我没有工作。

这是我的代码

public class LoginFragment extends Fragment {

    private static final String SAVED_EMAIL="savedEmail";
    private static final String SAVED_PASSWORD="savedPassword";
    String saved_email, saved_password;
...
@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(savedInstanceState != null){
            saved_email = (String) savedInstanceState.get(SAVED_EMAIL);
            saved_password = (String) savedInstanceState.get(SAVED_PASSWORD);
        }
    }

 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.logintest, container, false);

 btn_login = view.findViewById(R.id.btn_logintest);
        loading = view.findViewById(R.id.loadingtest);
        email = view.findViewById(R.id.etEmail);
        password = view.findViewById(R.id.etPassword);


            btn_login.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    login();
                }

                public void login() {
                    str_email = email.getText().toString();
                    str_password = password.getText().toString();

                    if (!str_email.equals("") && !str_password.equals("")) {

                        StringRequest request = new StringRequest(Request.Method.POST, URL_LOGIN, new Response.Listener<String>() {
                            @Override
                            public void onResponse(String response) {
                                //bei erfolgtreichen Login wird neues Fragment geöffnet
                                FragmentManager fragmentManager = getFragmentManager();
                                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                                DummyFragment dummyFragment = new DummyFragment();
                                fragmentTransaction.replace(R.id.container, dummyFragment);
                                fragmentTransaction.addToBackStack(null);
                                fragmentTransaction.commit();

                                Log.e("anyText", response);
                                Toast.makeText(getActivity(), "erfolgreicher Text: " + response, Toast.LENGTH_LONG).show();
                            }
                        }, new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                Toast.makeText(getActivity(), "Text: " + error.getMessage().toString(), Toast.LENGTH_SHORT).show();
                            }
                        }
                        ) {
                            @Override
                            public Map<String, String> getHeaders() throws AuthFailureError {
                                Map<String, String> params = new HashMap<>();
                                params.put("Content-Type", "application/json");
                                //benutzerdaten müssen noch sicher gespeichert werden
                                String creds = String.format("%s:%s", "username", "password");
                                String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT);
                                params.put("Authorization", auth);
                                params.put("str_email", email.getText().toString());
                                params.put("str_password", password.getText().toString());
                                return params;
                            }
                        };

                        RequestQueue requestQueue = Volley.newRequestQueue(getActivity().getApplicationContext());
                        requestQueue.add(request);

                    } else {
                        if (email.getText().toString().equals("")) {
                            Toast.makeText(getActivity(), "Bitte Email Adresse eingeben", Toast.LENGTH_SHORT).show();
                        } else if (password.getText().toString().equals("")) {
                            Toast.makeText(getActivity(), "Bitte Passwort eingeben", Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            });
            return view;
        }
        @Override
        public void onSaveInstanceState (Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("savedEmail", SAVED_EMAIL);
        outState.putString("password", SAVED_PASSWORD);
        } 
}

有人可以帮帮我吗?我想理解如何做到这一点,我也需要正确的代码来理解它。 非常感谢。

编辑 主要活动

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getSupportFragmentManager().beginTransaction().replace(R.id.container,
                new LoginFragment()).commit();
    }
}

更新代码

public class LoginFragment extends Fragment {

    private static final String SAVED_EMAIL="savedEmail";
    private static final String SAVED_PASSWORD="savedPassword";

    private Button btn_login;
    String str_email, str_password;
    private ProgressBar loading;
    private EditText email, password;
    String saved_email, saved_password;

 @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(savedInstanceState != null){
            saved_email = (String) savedInstanceState.get(SAVED_EMAIL);
            saved_password = (String) savedInstanceState.get(SAVED_PASSWORD);
        }
    }


    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.logintest, container, false);

        btn_login = view.findViewById(R.id.btn_logintest);
        loading = view.findViewById(R.id.loadingtest);
        email = view.findViewById(R.id.etEmail);
        password = view.findViewById(R.id.etPassword);

        if(savedInstanceState != null) {
            saved_email = (String) savedInstanceState.get(SAVED_EMAIL);
            saved_password = (String) savedInstanceState.get(SAVED_PASSWORD);
        }

        if (saved_email != null) {
            email.setText(saved_email);
            Toast.makeText(getActivity(), saved_email, Toast.LENGTH_SHORT).show();
        }
        if (saved_password != null) {
            password.setText(saved_password);
            Toast.makeText(getActivity(), saved_password, Toast.LENGTH_SHORT).show();
        }

        btn_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                    login();
                }

                public void login() {
                    str_email = email.getText().toString();
                    str_password = password.getText().toString();

                    if (!str_email.equals("") && !str_password.equals("")) {

                        StringRequest request = new StringRequest(Request.Method.POST, URL_LOGIN, new Response.Listener<String>() {
                            @Override
                            public void onResponse(String response) {
                                //bei erfolgtreichen Login wird neues Fragment geöffnet
                                FragmentManager fragmentManager = getFragmentManager();
                                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                                DummyFragment dummyFragment = new DummyFragment();
                                fragmentTransaction.replace(R.id.container, dummyFragment);
                                fragmentTransaction.addToBackStack(null);
                                fragmentTransaction.commit();

                                Log.e("anyText", response);
                                Toast.makeText(getActivity(), "erfolgreicher Text: " + response, Toast.LENGTH_LONG).show();
                            }
                        }, new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                Toast.makeText(getActivity(), "Text: " + error.getMessage().toString(), Toast.LENGTH_SHORT).show();
                            }
                        }
                        ) {
                            @Override
                            public Map<String, String> getHeaders() throws AuthFailureError {
                                Map<String, String> params = new HashMap<>();
                                params.put("Content-Type", "application/json");
                                //benutzerdaten müssen noch sicher gespeichert werden
                                String creds = String.format("%s:%s", "username", "password");
                                String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT);
                                params.put("Authorization", auth);
                                params.put("str_email", email.getText().toString());
                                params.put("str_password", password.getText().toString());
                                return params;
                            }
                        };

                        RequestQueue requestQueue = Volley.newRequestQueue(getActivity().getApplicationContext());
                        requestQueue.add(request);

                    } else {
                        if (email.getText().toString().equals("")) {
                            Toast.makeText(getActivity(), "Bitte Email Adresse eingeben", Toast.LENGTH_SHORT).show();
                        } else if (password.getText().toString().equals("")) {
                            Toast.makeText(getActivity(), "Bitte Passwort eingeben", Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            });
            return view;
        }
        @Override
        public void onSaveInstanceState (Bundle outState) {
        super.onSaveInstanceState(outState);
            outState.putString(SAVED_EMAIL, "savedEmail");
            outState.putString(SAVED_PASSWORD, "password");
        }
}

我找到问题了

我在 MainActivity.class

中添加了这一行
if (savedInstanceState == null) <-- this line
        {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.container, new LoginFragment())
                    .commit();
        }

现在可以了:-)

您似乎缺少代码中 UI 部分的变量。 我现在在你的代码中找不到 set variable to UI 部分。

所以你需要添加这段代码。

   email.setText(saved_email);
   password.setText(saved_password);

更新:

我在你的代码中发现了一个问题。
您在 saveInstance 时设置了错误的参数。所以我改了。

这是完整代码。

public class LoginFragment extends Fragment {

    private static final String SAVED_EMAIL="savedEmail";
    private static final String SAVED_PASSWORD="savedPassword";
    String saved_email, saved_password;

    ...............

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(savedInstanceState != null){
            saved_email = (String) savedInstanceState.get(SAVED_EMAIL);
            saved_password = (String) savedInstanceState.get(SAVED_PASSWORD);
        }
    }

    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.logintest, container, false);

        btn_login = view.findViewById(R.id.btn_logintest);
        loading = view.findViewById(R.id.loadingtest);
        email = view.findViewById(R.id.etEmail);
        password = view.findViewById(R.id.etPassword);

        // This is added part. ====================
        if(savedInstanceState != null) {
          saved_email = (String) savedInstanceState.get(SAVED_EMAIL);
          saved_password = (String) savedInstanceState.get(SAVED_PASSWORD);
        }

        if (saved_email != null) {
            email.setText(saved_email);
        }
        if (saved_password != null) {
            password.setText(saved_password);
        }
       // ========================================

        .........

        return view;
    }

    @Override
    public void onSaveInstanceState (Bundle outState) {
        super.onSaveInstanceState(outState);
        // it's wrong, so i changed.
        //outState.putString("savedEmail", SAVED_EMAIL);
        //outState.putString("password", SAVED_PASSWORD);
        outState.putString(SAVED_EMAIL, "savedEmail");
        outState.putString(SAVED_PASSWORD, "password");
    } 
}