簡體   English   中英

Android RecyclerView Edittext 問題

[英]Android RecyclerView Edittext issue

我正在創建一個可編輯項目列表(從后端接收)。 為此,我正在使用“新”回收站視圖。 我的回收站視圖中有幾個可能的視圖類型:

  • 復選框
  • 旋轉器
  • 編輯文本

我遇到的問題是 EditText 獲得焦點。 AdjustResize 正常工作,並顯示了我的鍵盤。 但是獲得焦點的 EditText 在列表中不再可見。 (現在調整大小部分的列表中的位置低於可見位置)。 在這種情況下,我不想使用 AdjustPan,因為在頂部有一個尋呼機和我想固定在那里的東西..

發生這種情況是因為在顯示鍵盤時,您的EditText不再存在。 我已經進行了多次嘗試以找到解決此問題的干凈解決方案,以保持adjustResize輸入模式和良好的用戶體驗。 這是我的結果:

為了確保在顯示鍵盤之前EditText可見,您必須手動滾動RecyclerView ,然后聚焦您的EditText 您可以通過覆蓋代碼中的焦點和單擊處理來實現。

首先,通過將android:focusableInTouchMode屬性設置為false來禁用對EditText的關注:

<EditText
    android:id="@+id/et_review"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusableInTouchMode="false"/>

然后,您必須為EditText設置一個單擊偵聽器,您將在其中手動滾動RecyclerView ,然后顯示鍵盤。 您必須知道包含EditText ViewHolder的位置:

editText.setOnClickListener(new View.OnClickListener() {
    @Override public void onClick(View v) {
        LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        // you may want to play with the offset parameter
        layoutManager.scrollToPositionWithOffset(position, 0);
        editText.setFocusableInTouchMode(true);
        editText.post(() -> {
            editText.requestFocus();
            UiUtils.showKeyboard(editText);
        });
    }
});

最后,您必須確保EditText在自然失去焦點時不再可聚焦:

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) {
            editText.setFocusableInTouchMode(false);
            UiUtils.hideKeyboard();
        }
    }
});

這遠不是一個簡單而干凈的解決方案,但希望它可以幫助我。

我有同樣的問題。 長話短說 - 沒有正確而優雅的解決方案。 焦點處理在 Android 中一直是一個很大的痛點。

注意力不集中的原因有很多:

  • 鍵盤隱藏后代EditText視圖
  • Next EditText不會被渲染,因為RecycleView甚至還沒有為它創建一個ViewHolder 示例:您有 10 個視圖,其中 5 個在屏幕上,其他不可見,因為它們在下面。
  • 其他一些視圖消耗焦點,例如CheckBox或某些DatePicker
  • RecyclerView由於滾動事件消耗焦點
  • 一堆其他隱藏的引擎蓋下的東西

我的解決方案中關於架構和結構方法的幾句話:

  • 一切都適用於數據綁定
  • RecyclerView 與支持AdapterDelegate方法的 Adapter配合使用
  • 每個EditTextSpinnerDatePickerCheckBoxRadioButton組都是一個單獨的 ViewModel,它是一個單獨的單元,可以自己處理很多東西。

我使用了很多技巧並將它們混合在一起。 正如有人已經提到的,第一步是將這些參數添加到您的RecyclerView

            android:descendantFocusability="beforeDescendants"
            android:focusable="true"
            android:focusableInTouchMode="true"

所有可能輸入的基本視圖模型都定義了 interface ,我們稱之為SingleInputViewModel ,在該接口中,您可以定義下一個函數/方法:

void onFocusGained();

void onFocusLost();

boolean isFocusable();

在每個特定的輸入項實現中,您都可以控制 focus ,例如,您可以將CheckBox實現為不可聚焦,並且焦點將跳轉到下一個isFocusable() == true項。 此外,您將能夠根據對特定視圖的消耗/獲得關注來控制狀態和動作。

修復一些焦點傳遞問題的下一步是IME_ACTION_NEXT發生時滾動 RecyclerView 在這種情況下,您需要將滾動邏輯委托給LayoutManager.scrollHorizontallyBy()LayoutManager.scrollToPosition()並計算適當的偏移量或位置。

硬而優雅的方法是覆蓋LayoutManager內部的邏輯,它也負責焦點處理。 LinearLayoutManager有很多隱藏的邏輯,您將無法覆蓋這些邏輯,因此您可能需要從頭開始編寫大量代碼。

最后也是最復雜的修復方法是擴展RecyclerView並覆蓋與焦點搜索相關的樂趣/方法:

  • RecyclerView.focusSearch()
  • RecyclerView.isPreferredNextFocus()
  • RecyclerView.onRequestFocusInDescendants()
  • RecyclerView.onFocusSearchFailed()
  • RecyclerView.onInterceptFocusSearch()
  • RecyclerView.onRequestChildFocus()

PS看看FocusFinder及其用法,僅供一般知識。 現在你幾乎沒有選擇。 我希望你會發現一些有用的東西。 祝你好運!

在布局中使用它: android:descendantFocusability="beforeDescendants"

<android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:descendantFocusability="beforeDescendants"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/extrasLayout"
        android:layout_below="@+id/anchorView"
        android:layout_marginTop="@dimen/margin5"
        android:fastScrollEnabled="false"
        />

清單文件:將此添加到活動部分android:windowSoftInputMode="stateHidden|adjustPan"

<activity
            android:name=".activites.CartActivity"
            android:label="@string/title_activity_cart"
            android:exported="true"
            android:windowSoftInputMode="stateHidden|adjustPan"
            android:parentActivityName=".activites.HomeActivity"
            android:screenOrientation="portrait">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".activites.HomeActivity"/>
        </activity>

好的,我找到了這個問題的解決方案,我為此使用了一個庫,它很容易解決。 當您通過此模板制作 recyclerView 時,它會自動解決此問題。

注意:僅適用於復選框和單選按鈕

用這個

https://github.com/TakeoffAndroid/RecyclerViewTemplate

我將發布我的解決方案,因為在被此阻止 2 天后,我希望它可以幫助其他人。

我的問題是 RecyclerView 是高度上的wrap_content ,這意味着它沒有固定的高度,並且每次我第一次單擊其中的一個編輯文本時,它都沒有將重點放在第一次點擊,但它只是顯示鍵盤,第二次點擊它正在獲得焦點。

解決方法是確保 RecyclerView 具有固定的高度或 match_parent,我真的不知道為什么,但這對我有用!

希望能幫助到你

我把這三件事都放在了 recyclerview 中,最后它停止了 recyclerview edittext 獲得焦點

 android:descendantFocusability="beforeDescendants"
        android:focusable="true"
        android:focusableInTouchMode="true"

我試過這個,它在復選框中有效:1-

holder.swDone.setOnCheckedChangeListener(null);

2-檢查或解決

3-

holder.swDone.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {}

發生這種情況是因為從 android 9.0 開始,您必須編寫 post()-> 才能在以前的版本中獲得編輯文本的焦點,您可以將
edittext.requestFocus();

但是從 9.0 開始,您必須運行線程才能像這樣獲得編輯文本的焦點
et.post(() -> {et.requestFocus();});

您可以在編輯文本焦點更改偵聽器上將回收器視圖滾動到選定的回收器項目位置。 看看使用滾動選項的鏈接如何使用 RecyclerView.scrollToPosition() 將位置移動到當前視圖的頂部?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM