我在一个片段中有一个线性布局,里面有一堆复选框和各种edittext小部件。基本上像一个测验。一堆多项选择(复选框)和十几个简答题(edittexts)问题。
我希望用户能够单击编辑文本,输入答案,然后按DONE或单击布局上的任何其他位置,让窗口小部件失去焦点并隐藏键盘。目前,我正在覆盖每个edittext的setOnEditorActionListener
和setOnFocusChangeListener
方法,以便将焦点重新放回主布局,并分别隐藏键盘。以下是名为“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都有这种行为,而不是把它全部“硬编码”到我的片段类中?
答案 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;
}
});