如何在列表视图中聚焦下一个编辑文本

Posted

技术标签:

【中文标题】如何在列表视图中聚焦下一个编辑文本【英文标题】:How to focus next edit text in listview 【发布时间】:2017-01-17 03:59:28 【问题描述】:

Listview 中的每一行都有 2 个 EditText。这些行可能是 n 个数字。我想在第一行的第一个 EditText 中输入值,然后在软键盘中按下一步。焦点应转到第一行的第二个 EditText。之后,我将在第二个 EditText 中输入值并在软键盘中按下一步,焦点应该转到第二行第一个 EditText。特此附上我的 xml 和适配器代码。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_
    android:layout_>

    <LinearLayout
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:paddingTop="5dp"
        android:layout_weight="10"
        android:layout_
        android:layout_
        android:orientation="horizontal">
        <com.vijay.textview.AutofitTextView
            android:layout_gravity="center_vertical"
            android:id="@+id/txt_component"
            android:layout_
            android:layout_
            android:layout_weight="6"
            android:fontFamily="sans-serif"
            android:text="@string/empty_string"
            android:textColor="@color/planned_schedule_list_item_color"
            android:textSize="@dimen/bol_listview_font_size"/>

        <com.vijay.edittext.AutoFitEditText
            android:id="@+id/edt_ready_to_go"
            android:paddingBottom="3dp"
            android:layout_marginTop="-15dp"
            style="@style/scan_text_fields_white_bg"
            android:layout_
            android:layout_
            android:layout_weight="4"
            android:fontFamily="sans-serif"
            android:inputType="number"
            android:textColor="@color/planned_schedule_list_item_color"
            android:textSize="@dimen/bol_listview_header_font_size"
            android:imeOptions="flagNoExtractUi"
            android:maxLength="5"
            android:nextFocusRight="@id/edt_damaged"/>

        <com.vijay.edittext.AutoFitEditText
            android:id="@+id/edt_damaged"
            android:paddingBottom="3dp"
            android:layout_marginTop="-15dp"
            style="@style/scan_text_fields_white_bg"
            android:layout_
            android:layout_
            android:layout_weight="4"
            android:fontFamily="sans-serif"
            android:inputType="number"
            android:textColor="@color/planned_schedule_list_item_color"
            android:textSize="@dimen/bol_listview_header_font_size"
            android:imeOptions="flagNoExtractUi"
            android:maxLength="5"/>
    </LinearLayout>
</LinearLayout>

我的适配器代码是:

holder.edtReadyToGo.setOnEditorActionListener(new TextView.OnEditorActionListener() 
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
            if (actionId == EditorInfo.IME_ACTION_NEXT) 
                if (position + 1 != mData.size()) 
                mListView.smoothScrollToPosition(position+1);
                mListView.postDelayed(new Runnable() 
                    public void run() 
                        AutoFitEditText nextField = (AutoFitEditText) holder.edtDamaged.focusSearch(View.FOCUS_RIGHT);
                        if (nextField != null) 
                            nextField.requestFocus();
                        
                    
                , 200);
                return true;
               

            else if (actionId == EditorInfo.IME_ACTION_DONE) 
                holder.edtReadyToGo.setCursorVisible(false);
            
            return false;
        
    );

    holder.edtDamaged.setOnEditorActionListener(new TextView.OnEditorActionListener() 
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
            if (actionId == EditorInfo.IME_ACTION_NEXT) 
                if (position + 1 != mData.size()) 
                    mListView.smoothScrollToPosition(position+1);
                    mListView.postDelayed(new Runnable() 
                        public void run() 
                            AutoFitEditText nextField = (AutoFitEditText) holder.edtReadyToGo.focusSearch(View.FOCUS_DOWN);
                            if (nextField != null) 
                                nextField.requestFocus();
                            
                        
                    , 200);
                    return true;
                

             else if (actionId == EditorInfo.IME_ACTION_DONE) 
                holder.edtDamaged.setCursorVisible(false);
            
            return false;
        
    );

我的第二个 EditText(edt_damaged) 工作正常。当我单击下一步时,它会自动聚焦到下一个字段。但是第一个 EditText(edt_ready_to_go) 不起作用。请帮我解决我的问题。

【问题讨论】:

【参考方案1】:

你可以通过设置试试

listview 到 android:descendantFocusability="afterDescendants" listview 到 setItemsCanFocus(true); 将您的活动设置为 android:windowSoftInputMode="adjustResize"

【讨论】:

我会尽力让你知道..!! 一切正常。但是当它来到最后一行时,它在第一次编辑文本中显示完成。这样我们就不能移动到最后一行的第二个编辑文本。有什么想法吗?? 将 android:windowSoftInputMode="adjustResize" 更改为 "adjustPan" 您是否删除了您之前尝试过的其他列表视图代码。我已经实现了一个示例代码,它对我来说工作正常 是的..我删除了所有..如果你不介意你可以发布那个样本..拜托..

以上是关于如何在列表视图中聚焦下一个编辑文本的主要内容,如果未能解决你的问题,请参考以下文章

带有列表子项可聚焦android的列表视图上下文菜单

检查时如何在列表视图中删除文本项?

将文本表的数据导出为 .csv (Tableau)

如何绑定列表视图

在自定义适配器中隐藏软键盘

滚动列表视图时文本视图中的数据切换