EditText表单:“done”键将焦点传递回屏幕上

时间:2015-08-25 15:40:50

标签: android android-layout android-edittext android-view

我有一个滚动视图,动态地填充了相当通用的EditTexts。 Flow似乎工作正常:用户填写一个字段,点击软键盘上的“下一个”按钮,焦点传递到下一个EditText。

在最终的EditText上,“下一步”按钮被“完成”替换,因为Android意识到没有更多的视图可以向下聚焦。在没有很多字段的页面上(因此没有滚动),这可以正常工作。 “完成”键关闭键盘,用户可以进入下一页。但是,在有更多EditTexts和滚动的页面上,当用户点击最终EditText上的“done”键时,焦点将被发送到第一个可见的EditText,而不是关闭键盘并按预期移除焦点。我不确定为什么会这样,这引起了一个令人头痛的问题。

此外,我还有另一个几乎完全相同的问题,可以通过完全相同的解决方案解决。当用户向下滚动然后点击操作栏上的按钮时,第一个可见的EditText会获得焦点。我不希望这种情况发生。我更喜欢当前的EditText失去对按钮的关注,但是当我点击按钮时似乎没有触发onFocusChangeListener

真的很感激任何帮助!这是一些代码:

我的通用EditText布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center" >

<EditText
    android:id="@+id/editTextRow"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textCursorDrawable="@drawable/cursor_white" />

</RelativeLayout>

包含TextViews(EditTexts)列表的布局:

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:orientation="vertical" >

        <TextView 
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="3"
            android:id="@+id/title"
            android:gravity="center"
            />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="7"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:id="@+id/form_view"
            android:orientation="vertical">
        </LinearLayout>
    </LinearLayout>
</ScrollView>

我的onFocusChangeListener

if (hasFocus){
                if (item.itemFormat.equals("currency")){
                    s = s.replaceAll("\\$", "").replaceAll(",", "");
                }
                text.setText(s);
                ((EditText)text).selectAll();
                imm.showSoftInput(text, InputMethodManager.SHOW_IMPLICIT);
        }
        else {
            //storing values for form happens here
            text.clearFocus();
        }

0 个答案:

没有答案