问题描述
我正在努力让它发挥作用。 我有一个登录片段。现在我想要更好的用户体验。当用户旋转他的设备时,eddittext 字段应该保存了值,即邮箱地址。 我阅读了许多关于片段生命周期的教程和许多代码示例,但我不工作。
这是我的代码
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,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,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 部分的变量。 我现在在你的代码中找不到设置变量到 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");
}
}