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

pix*_*xel 5 android

我读到的大部分内容都说你应该打电话onSaveInstanceState()给你DialogFragment保存它的状态,然后调用onActivityCreated()并恢复那里的状态.虽然这有效,但我发现了一个问题:

如果我有EditText自己的自定义布局,请DialogFragment AlertDialog说我输入密码.在输入的最后一个密码字符后,密码被屏蔽,光标闪烁.如果我保存输入的值EditTextonSaveInstanceState()使用恢复状态onActivityCreated(),这是恢复,但将光标移动到我刚才旋转,而不是停留在年底前键入的开始.

但是,如果我onCreateDialog()通过首先检查我savedInstanceState的null 来恢复我保存的内容,那么我的光标会在输入的最后一个字符之后保持在结尾处.

我想知道哪种方法是正确的,虽然我看到两者都正常工作并保留密码进行轮换更改.只有少数人认为光标移动到开头而不是停留在最后onActivityCreated().

Bob*_*der 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();
    }
}
Run Code Online (Sandbox Code Playgroud)