完成编辑后,使EditText将焦点传递回父布局。

时间:2016-11-11 06:46:26

标签: java android android-edittext

我在一个片段中有一个线性布局,里面有一堆复选框和各种edittext小部件。基本上像一个测验。一堆多项选择(复选框)和十几个简答题(edittexts)问题。

我希望用户能够单击编辑文本,输入答案,然后按DONE或单击布局上的任何其他位置,让窗口小部件失去焦点并隐藏键盘。目前,我正在覆盖每个edittext的setOnEditorActionListenersetOnFocusChangeListener方法,以便将焦点重新放回主布局,并分别隐藏键盘。以下是名为“input_7d”的edittext实例的代码:

    final EditText input_7d = (EditText) thisview.findViewById(R.id.txtinput_7d);
    final LinearLayout parentLayout = (LinearLayout) thisview.findViewById(R.id.main_layout);

    input_7d.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(actionId == EditorInfo.IME_ACTION_DONE) {
                parentLayout.requestFocus();
            }
            return false;
        }
    });

    input_7d.setOnFocusChangeListener(new TextView.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if(!hasFocus){
                InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(parentLayout.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
            }
        }
    });

这对于我添加的每个edittext都很烦人,这意味着如果删除它们或将来添加更多代码,则会编辑大量代码。我想要做的是有一个自定义的edittext类,可以将焦点返回到它的父视图/布局并隐藏键盘,然后使用它而不是内置的edittext。我对此非常陌生,我无法找到自定义edittext的方法将焦点传回给它的父布局。有没有更好的方法来获得一堆edittexts都有这种行为,而不是把它全部“硬编码”到我的片段类中?

2 个答案:

答案 0 :(得分:1)

所以我找不到一种方法让edittext将焦点从视图本身传回到它的父布局。所以我选择在它

时禁用它的可聚焦属性

1)它失去了焦点(用户在视图外点击了可聚焦的东西,即父布局)

2)完成编辑(用户按下软键盘上的完成操作)

令人惊讶的是,默认情况下,这些操作都不会从默认的editText中删除焦点和光标。至少不在我的滚动视图中。

所以我将这些行添加到扩展editText视图的自定义视图(myEditText)中:

this.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if(actionId == EditorInfo.IME_ACTION_DONE) {
            myEditText.setFocusable(false);
            myEditText.setFocusableInTouchMode(false);

        }
        return false;
    }
});
this.setOnFocusChangeListener(new TextView.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(!hasFocus){
            myEditText.setFocusable(false);
            myEditText.setFocusableInTouchMode(false);
            hideKeyboardFrom(context, v);
        }
    }
});
this.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        myEditText.setFocusableInTouchMode(true);
        myEditText.setFocusable(true);
        return false;
    }
});

我发现真正令人讨厌的是要获得简单的功能,例如不要让光标一直闪烁在我身上,或者在更改片段时视图没有聚焦,因此你必须做这样一个奇怪的解决方法。制作一个不可聚焦的视图,除非它集中在哪种情况下它是可聚焦的,但只有在它不再聚焦时才会显得愚蠢。仍然想知道是否有更好的方法在一个布局中进行大量编辑。

答案 1 :(得分:0)

您可以为根布局设置触摸侦听器,然后在视图不需要时删除焦点

     findViewById(R.id.rootView).setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
         v.requestFocusFromTouch() //check for y
            return false;
        }
    });