我在表格活动中遇到旋转器问题。
当用户“触摸”它时,我期待一个微调器获得焦点,但这似乎不会发生。如果我使用我的跟踪球(在Nexus One上)在不同组件之间移动,旋转器似乎只会获得焦点。
这很烦人,因为我在表单的第一个EditText视图中使用了android:selectAllOnFocus =“true”属性。因为旋转器永远不会将焦点从EditText组件移开,所以它的内容总是高亮显示(这是丑陋的IMO)。
我尝试过使用
spinner.requestFocus();
但这(看似)没有效果。
我已尝试在AdapterView.OnItemSelectedListener中请求专注于微调器,但他的结果只是
Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@44cb0380
任何人都可以解释这种奇怪的行为和/或可能的方法。
非常感谢,
添
答案 0 :(得分:1)
您必须先使用setFocusableInTouchMode()
。然后你遇到了另一个问题:你必须点击微调器两次来改变它(一次设置焦点,然后再次看到选项列表)。我的解决方案是创建我自己的Spinner子类,使第一次点击的焦点增益模拟第二个:
class MySpinnerSubclass extends Spinner {
private final OnFocusChangeListener clickOnFocus = new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
// We don't want focusing the spinner with the d-pad to expand it in
// the future, so remove this listener until the next touch event.
setOnFocusChangeListener(null);
performClick();
}
};
// Add whatever constructor(s) you need. Call
// setFocusableInTouchMode(true) in them.
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN) {
// Only register the listener if the spinner does not already have
// focus, otherwise tapping it would leave the listener attached.
if (!hasFocus()) {
setOnFocusChangeListener(clickOnFocus);
}
} else if (action == MotionEvent.ACTION_CANCEL) {
setOnFocusChangeListener(null);
}
return super.onTouchEvent(event);
}
}
为了得到适当的信任,我的灵感来自Kaptkaos's answer到this question。