使用savedInstanceState在DialogFragment中保存和恢复EditText光标位置

时间:2015-07-02 20:23:53

标签: android

我读到的大部分内容都表示您应该在onSaveInstanceState()上致电DialogFragment以保存其状态,然后拨打onActivityCreated()并恢复其中的状态。虽然这有效,但我发现了一个问题:

如果我的EditText DialogFragment的自定义布局中有AlertDialog,请说我输入密码。在输入的最后一个密码字符后,密码被屏蔽,光标闪烁。如果我保存EditTextonSaveInstanceState()中输入的值并使用onActivityCreated()恢复状态,则会将其恢复,但光标会移动到我刚刚旋转前输入的内容的开头,而不是停留在结束。

但是,如果我通过首先检查onCreateDialog()为空来恢复使用savedInstanceState保存的内容,那么我的光标会在输入的最后一个字符后保留在结尾处。 / p>

我想知道哪种方法是正确的,虽然我看到两者都正常工作并且在轮换更改时保留了密码。在onActivityCreated()的情况下,只有一个人认为光标移动到开头而不是停留在最后。

1 个答案:

答案 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();
    }
}