纺纱厂和重点

时间:2010-11-22 15:32:49

标签: android

我在表格活动中遇到旋转器问题。

当用户“触摸”它时,我期待一个微调器获得焦点,但这似乎不会发生。如果我使用我的跟踪球(在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

任何人都可以解释这种奇怪的行为和/或可能的方法。

非常感谢,

1 个答案:

答案 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 answerthis question