[英]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
視圖EditText
不會被渲染,因為RecycleView
甚至還沒有為它創建一個ViewHolder
。 示例:您有 10 個視圖,其中 5 個在屏幕上,其他不可見,因為它們在下面。CheckBox
或某些DatePicker
RecyclerView
由於滾動事件消耗焦點我的解決方案中關於架構和結構方法的幾句話:
EditText
、 Spinner
、 DatePicker
、 CheckBox
或RadioButton
組都是一個單獨的 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 時,它會自動解決此問題。
注意:僅適用於復選框和單選按鈕
用這個
我將發布我的解決方案,因為在被此阻止 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.