我有一个带有多个EditText和Spinner控件的垂直滚动布局。 问题是当我选择任何微调器选项后,屏幕滚动回到最后一个EditText正在编辑此微调器之前。 Focus仍然是我正在编辑的最后一个EditText。有没有办法可以保持焦点与当前选定的微调器。
我正在寻找一种解决方案,可以在布局XML或某些通用方法的所有微调器上实现,以应用于所有微调器。
答案 0 :(得分:3)
使用它来避免EditText Focus:
scrollView = (ScrollView) findViewById(R.id.scrollView_id);
scrollView.setOnTouchListener(new OnTouchListener() {
// to solve foocus problem on scrolling
public boolean onTouch(View v, MotionEvent event) {
if (myEditText.hasFocus()) {
myEditText.clearFocus();
}
if (myEditText1.hasFocus()) {
myEditText1.clearFocus();
}
return false;
}
});
答案 1 :(得分:3)
这是我的解决方案。
mSpinner.setFocusableInTouchMode(true);
mSpinner.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
if (mSpinner.getWindowToken() != null) {
mSpinner.performClick();
}
}
}
});
答案 2 :(得分:1)
我在莱德兹回答的帮助下解决了这个问题。这是代码:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
scrollView = (ScrollView) findViewById(R.id.sv_main);
scrollView.setOnTouchListener(new OnTouchListener() {
// to solve focus problem on scrolling
public boolean onTouch(View v, MotionEvent event) {
IBinder windowToken = null;
if (myEditText1.hasFocus()) {
myEditText1.clearFocus();
windowToken = myEditText1.getWindowToken();
}
if (myEditText2.hasFocus()) {
myEditText2.clearFocus();
windowToken = myEditText2.getWindowToken();
}
if (myEditText3.hasFocus()) {
myEditText3.clearFocus();
windowToken = myEditText3.getWindowToken();
}
if (windowToken != null) {
imm.hideSoftInputFromWindow(windowToken, 0);
}
scrollView.requestFocusFromTouch();
return false;
}
});
然后我为我的textViews设置了android:focusable =“true”,以便在从editText中删除焦点时滚动,然后可以选择Textviews进行焦点。以这种方式,用户在屏幕上看不到任何聚焦控制。
答案 3 :(得分:0)
我遇到了和你一样的问题,我已经解决了这个问题。
我重新定义了OnItemSelectedListener,当微调器更改值时,我会关注焦点,然后再次释放。
这是我的CustomOnItemSelectedListener类:
public class CustomOnItemSelectedListener implements AdapterView.OnItemSelectedListener{
private Spinner mSpinner;
private int iCurrentSelection;
public CustomOnItemSelectedListener(Spinner s){
mSpinner = s;
iCurrentSelection = mSpinner.getSelectedItemPosition();
}
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
if (iCurrentSelection != arg2) {
mSpinner.setFocusableInTouchMode(true);
mSpinner.requestFocus();
mSpinner.setFocusableInTouchMode(false);
mSpinner.clearFocus();
}
iCurrentSelection = arg2;
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
//No hace falta hacer nada
}
}
在我的代码中,我这样做
Spinner spinner = (Spinner) rootView.findViewById(R.id.spinner);
spinner.setOnItemSelectedListener(new CustomOnItemSelectedListener(spinner));
如果你想保持焦点,不要做“clearFocus()”。