用户选择后将Spinner焦点设置为Spinner本身

3

当我开启TalkBack时,一旦在我的Spinner中进行选择,焦点立即回到屏幕顶部(工具栏)。我希望用户选择后焦点立即在Spinner上。

我尝试将Spinner设置为可聚焦:

spinner.setFocusable(true); 
spinner.setFocusableInTouchMode(true);

我查看了以下的StackOverflow问题和答案,但并没有直接解决我遇到的问题: 我注意到当选项被设置时,Spinner会短暂地失效。我猜这就是为什么焦点被委托给另一个视图的原因。如何避免这种失效或者规避它呢?
如果你能提供任何帮助将不胜感激。
2个回答

1
我能够通过以下步骤解决这个问题(希望这能帮助其他遇到同样问题的人):
    private boolean isUserSelection; // to detect user selection

    spinner.setChangeListener(this);
    spinner.setFocusable(true);
    spinner.setFocusableInTouchMode(true);
    if (((AccessibilityManager)getActivity().getSystemService(Context.ACCESSIBILITY_SERVICE)).isEnabled())
    {
        spinner.setOnFocusChangeListener(new View.OnFocusChangeListener()
        {
            @Override
            public void onFocusChange(View v, boolean hasFocus)
            {
                if (hasFocus && !isUserSelection)
                    v.performClick(); //bypasses the caret inside the spinner so user doesn't have to tap twice to open the drop down
                else if (!hasFocus && isUserSelection)
                    v.requestFocus();
            }
        });
    }

在spinner的itemSelectedListener中,使用以下代码:
if (isUserSelection && (AccessibilityManager)getActivity().getSystemService(Context.ACCESSIBILITY_SERVICE)).isEnabled()))
    durationSpinner.requestFocusFromTouch();

0

焦点在哪里?尝试像这样从那里请求焦点。

newlyFocusedView.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus){
            newlyFocusedView.clearFocus();
            spinner.requestFocus();
            spinner.performClick();
        }
    }
});

也可以尝试 spinner.setFocusable(true);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接