我读到的大部分内容都说你应该打电话onSaveInstanceState()给你DialogFragment保存它的状态,然后调用onActivityCreated()并恢复那里的状态.虽然这有效,但我发现了一个问题:
如果我有EditText自己的自定义布局,请DialogFragment AlertDialog说我输入密码.在输入的最后一个密码字符后,密码被屏蔽,光标闪烁.如果我保存输入的值EditText在onSaveInstanceState()使用恢复状态onActivityCreated(),这是恢复,但将光标移动到我刚才旋转,而不是停留在年底前键入的开始.
但是,如果我onCreateDialog()通过首先检查我savedInstanceState的null 来恢复我保存的内容,那么我的光标会在输入的最后一个字符之后保持在结尾处.
我想知道哪种方法是正确的,虽然我看到两者都正常工作并保留密码进行轮换更改.只有少数人认为光标移动到开头而不是停留在最后onActivityCreated().
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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4302 次 |
| 最近记录: |