使用edittext的DialogFragment在解除后不会丢失键盘

时间:2013-03-13 01:40:35

标签: android focus android-edittext android-softkeyboard dialogfragment

我有一个带有单个EditText且没有按钮的自定义DialogFragment。将文本输入edittext并按“完成”后,即使对话框被取消,键盘也会在返回主机活动时保持可见状态。它更改为数字键盘,因为它所关注的主机活动中的字段只是一个数字条目edittext - 但它也可能专注于具有普通文本输入的edittext字段(因此仍然是普通键盘)取决于我在启动对话框片段后离开光标的位置。

我已经尝试了所有我能找到的东西(谷歌搜索和堆栈溢出了很多)。

我基于this代码的对话片段 - 它非常相似。

问题与this非常相似,我认为原因可能类似,但我的DialogFragment中没有按钮,所以我不能按照这个解决方案,虽然我认为不重要但我可以密切关注它。

我尝试使用inputmethodmanager按照建议使用here来解除键盘,在接口方法(在主机活动中实现)和onCreateViewonEditorAction和DialogFragment类中的onDismiss。还在DialogFragment类方法中尝试getDialog().getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);(也使用SOFT_INPUT_STATE_HIDDEN)。在所有DF类方法中也尝试mEditText.clearFocus();无效。

任何人都可以帮忙吗?这与我基于我的David Chandler's code有什么关系,或者我具体做错了什么。所有人都非常感谢。

我在下面包含我的DF课,以防有人想看。

public class SetText extends DialogFragment {


public interface SetTextBoxDialogListener{
    void onFinishEnteringName(String name);
}


private EditText mEditText;

//Empty constructor req'd for dialogfragment.
public SetText(){

}


//Build view
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle saveInstanceState) {
    View view = inflater.inflate(R.layout.activity_set_the_text, container);
    mEditText =  (EditText) view.findViewById(R.id.nameText);
    getDialog().setTitle("Enter Name");


    //removing these 2 lines of code has no effect
    mEditText.requestFocus();
    getDialog().getWindow().setSoftInputMode(LayoutParams.VISIBLE);


    mEditText.setOnEditorActionListener(new OnEditorActionListener() {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (EditorInfo.IME_ACTION_DONE==actionId){
                //return text to activity
                SetEnterNameDialogListener activity = (SetEnterNameDialogListener) getActivity();
                activity.onFinishEnteringName(mEditText.getText().toString());


                dismiss();
                return true;
            }
            //code for 2 lines below had now effect, even placed above dismiss
            InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);

        return false;
    }
});

return view;
}
}

1 个答案:

答案 0 :(得分:1)

在您从DialogFragment返回的清单中的host活动标记中的

使用以下

android:windowSoftInputMode="stateHidden"