在片段旋转中使用 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");
}
}
我正在努力让它工作。 我有一个登录片段。现在我想做更好的用户体验。当用户旋转他的设备时,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");
}
}