旋转框无法获得焦点

24

我在一个活动中使用了4个EditText字段和2个下拉框。这些组件的顺序是2个EditText,然后2个下拉框,最后是2个EditText字段。

问题出现在当我使用软键盘“下一步”按钮从EditText转移到下拉框时,下拉框无法获得焦点,焦点被转移到了在下拉框之后放置的下一个EditText字段。

我已经在下拉框上使用了requestfocus(),但它没有起作用。

我该如何确保下拉框获得焦点?


1
请授予答案标志。 - JJD
1
扣1分,因为没有授予所选答案。 - Jorge Gil
4个回答

44

我成功找到了一个解决方案,而不是重新定位我的Spinner。在EditText之前加入以下监听器:

editTextBefore.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView textView, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_NEXT) {
            hideKeyboard();
            textView.clearFocus();
            spinner.requestFocus();
            spinner.performClick();
        }
        return true;
    }
});

你还需要添加这些行到able spinner中,以便获得焦点:
spinner.setFocusable(true); // can be done in XML preferrable

我的hideKeyboard函数只是我想添加的一个视觉细节,以便隐藏键盘:
private void hideKeyboard() {
    InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(),
            InputMethodManager.HIDE_NOT_ALWAYS);
}

希望我能够在这个棘手的问题中提供帮助。
可以在文档中找到标记InputMethodManager.HIDE_NOT_ALWAYS


1
不必设置focusableInTouchMode吗? - IgorGanapolsky
设置focusableInTouchMode会很有帮助。另外,如果您尝试在XML中进行此操作似乎无效,请尝试以编程方式实现。 - Jorge Gil
1
此外,您还需要在xml中为EditText设置属性android:imeOptions="actionNext" - Vishal Yadav

20

谢谢,我已经通过以下方法解决了问题:

  1. 我将 Spinner 对象设置在最前面(即 onCreate 方法内),以确保我的代码首先被执行。
  2. 我使用了以下代码:

    Spinner s1 = (Spinner) findViewById(R.id.spinner1); 
    s1.setFocusable(true); 
    s1.setFocusableInTouchMode(true);
    s1.requestFocus();
    

3
你显然是从 @shanet 那里得到了解决方案,所以你应该只选择他们的答案。 - Nick Cardoso

7

谢谢,我已通过以下方式解决: 1)我将Spinner对象设置在顶部(在onCreate方法中),以确保我的代码首先执行。 2)我使用了以下代码:Spinner s1 =(Spinner)findViewById(R.id.spinner1); s1.setFocusable(true); s1.setFocusableInTouchMode(true); - Shameen
1
@Shameen 你本可以在XML中设置这些标志。 - IgorGanapolsky

-1

我之前也遇到了同样的问题。我使用了nextFocusDown/Up/Left/Right属性来解决它。

<EditText
    android:id="@+id/tPhone"
    ...
    android:focusableInTouchMode="true"
    android:focusable="true"
    android:nextFocusDown="@+id/sCountry"/>

<Spinner
    android:id="@+id/sCountry"
    ....
    android:focusableInTouchMode="true"
    android:focusable="true"
    android:nextFocusUp = "@+id/tPhone"
    android:nextFocusDown="@+id/tStreet"/>

 <EditText
    android:id="@+id/tStreet"
    ...
    android:visibility="gone"
    android:focusableInTouchMode="true"
    android:focusable="true" 
    android:nextFocusUp = "@+id/sCountry"/>

但为什么这甚至是必要的...超出了我的理解。


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