在android中选择时,将焦点设置在微调器上
我有一个带有多个EditText和微调器控件的垂直滚动布局。 问题是,当我在选择后选择任何微调器选项时,屏幕会滚动回上次编辑的位置。在此微调器之前,文本正在编辑。重点仍然是我上次编辑的文本。是否有一种方法可以使用当前选定的微调器保持焦点在android中选择时,将焦点设置在微调器上,android,android-edittext,spinner,Android,Android Edittext,Spinner,我有一个带有多个EditText和微调器控件的垂直滚动布局。 问题是,当我在选择后选择任何微调器选项时,屏幕会滚动回上次编辑的位置。在此微调器之前,文本正在编辑。重点仍然是我上次编辑的文本。是否有一种方法可以使用当前选定的微调器保持焦点 我正在寻找一种解决方案,它可以通过布局XML在所有微调器上实现,或者应用于所有微调器的一些通用方法。使用此方法可以避免编辑文本焦点: scrollView = (ScrollView) findViewById(R.id.scrollView_id);
我正在寻找一种解决方案,它可以通过布局XML在所有微调器上实现,或者应用于所有微调器的一些通用方法。使用此方法可以避免编辑文本焦点:
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;
}
});
我在Ryderz的帮助下解决了这个问题。代码如下:
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;
}
});
然后我为我的文本视图设置了android:focusable=“true”,这样当焦点从editText中移除时,可以在滚动时选择文本视图作为焦点。这样,用户就不会在屏幕上看到任何聚焦控件。我也遇到了与您相同的问题,我已经用此解决方案解决了
mSpinner.setFocusableInTouchMode(true);
mSpinner.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
if (mSpinner.getWindowToken() != null) {
mSpinner.performClick();
}
}
}
});
我重新定义了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
}
}
如果您想保持焦点,请不要执行“clearFocus()”以下是我的解决方案
mSpinner.setFocusableInTouchMode(true);
mSpinner.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
if (mSpinner.getWindowToken() != null) {
mSpinner.performClick();
}
}
}
});
谢谢你的回复。但我有多个EditText控件。因此,我希望避免对所有edittext单独实现clearFocus()。它会从edittext中删除焦点,但屏幕仍会滚动到edittext。感谢您的帮助。我为我的文本视图设置了android:focusable=“true”,并添加了scrollView.requestFocusFromTouch();将焦点发送到任何可见的子对象。现在很好用。没有为scrollview请求焦点并将textviews设置为可聚焦,屏幕滚动到布局的第一个编辑文本,尽管它没有聚焦。有效的解决方案。试试看!您可以简单地使用getCurrentFocus()方法,而不是使用多个if语句来找出哪个edittext具有焦点。它将返回此时具有焦点的视图。然后可以对该视图调用clearFocus()。