我读到的大部分内容都表示您应该在onSaveInstanceState()
上致电DialogFragment
以保存其状态,然后拨打onActivityCreated()
并恢复其中的状态。虽然这有效,但我发现了一个问题:
如果我的EditText
DialogFragment
的自定义布局中有AlertDialog
,请说我输入密码。在输入的最后一个密码字符后,密码被屏蔽,光标闪烁。如果我保存EditText
中onSaveInstanceState()
中输入的值并使用onActivityCreated()
恢复状态,则会将其恢复,但光标会移动到我刚刚旋转前输入的内容的开头,而不是停留在结束。
但是,如果我通过首先检查onCreateDialog()
为空来恢复使用savedInstanceState
保存的内容,那么我的光标会在输入的最后一个字符后保留在结尾处。 / p>
我想知道哪种方法是正确的,虽然我看到两者都正常工作并且在轮换更改时保留了密码。在onActivityCreated()
的情况下,只有一个人认为光标移动到开头而不是停留在最后。
答案 0 :(得分:5)
EditText小部件自动保存并恢复其自己的状态。您不需要保存和恢复输入的字符串。让小部件处理自己的状态,重启后光标位置不会改变。
以下是一个例子:
public class PasswordDialog extends DialogFragment {
private static final String TAG = "PasswordDialog";
private static final String TITLE_KEY = "title";
private String mTitle;
public static PasswordDialog newInstance(String title) {
PasswordDialog f = new PasswordDialog();
Bundle args = new Bundle();
args.putString(TITLE_KEY, title);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState==null) {
//not restart
Bundle args = getArguments();
if (args==null) {
throw new IllegalArgumentException("Bundle args required");
}
mTitle = args.getString(TITLE_KEY);
} else {
//restart
mTitle = savedInstanceState.getString(TITLE_KEY);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(TITLE_KEY, mTitle);
}
@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
Log.i(TAG, "onCreateDialog()");
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
View customView = inflater.inflate(R.layout.fragment_dialog_note_edit, null);
final EditText passwordView = (EditText) customView.findViewById(R.id.dialog_note_edit_text);
builder
.setTitle(mTitle)
.setView(customView)
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
//nothing
}
})
.setPositiveButton("Save", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
String password = passwordView.getText().toString();
Log.i(TAG, "password= " + password);
}
});
return builder.create();
}
}