Android中焦點移到ListView的問題(轉)
發現Android程式設計中的一個問題:如果在一個ListView上面放置一個可以接收焦點的東西,比如Button,當使用向上方向鍵滾動ListView到第一條後,焦點會移到上面的Button上,這個沒問題。但然後使用向下的方向鍵時,焦點會跳到ListView中當前視窗的最下面一條,而不是焦點離開時的第一條。在ListView下方有Button的時候,向上移動焦點,也會出現類似的情況。
這個問題在Android的示例裡面也有,ApiDemos->Views->Tabs->Content By Intent。這個示例裡當使用方向鍵從list這個Tab向下移動焦點的時候,會跳過一屏的條目。
在網上搜了一下,僅僅有一個人提到了這個問題,但沒有看到解答。
我查了一下原始碼,實現設定焦點的程式碼是:
git://android.git.kernel.org/platform/frameworks/base.git›core›java›android›widget›ListView.java
- @Override
- protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
- super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
- int closetChildIndex = -1;
- if (gainFocus && previouslyFocusedRect != null) {
- previouslyFocusedRect.offset(mScrollX, mScrollY);
- // figure out which item should be selected based on previously
- // focused rect
- Rect otherRect = mTempRect;
- int minDistance = Integer.MAX_VALUE;
- final int childCount = getChildCount();
- final int firstPosition = mFirstPosition;
- final ListAdapter adapter = mAdapter;
- for (int i = 0; i < childCount; i++) {
- // only consider selectable views
- if (!adapter.isEnabled(firstPosition + i)) {
- continue;
- }
- View other = getChildAt(i);
- other.getDrawingRect(otherRect);
- offsetDescendantRectToMyCoords(other, otherRect);
- int distance = getDistance(previouslyFocusedRect, otherRect, direction);
- if (distance < minDistance) {
- minDistance = distance;
- closetChildIndex = i;
- }
- }
- }
- if (closetChildIndex >= 0) {
- setSelection(closetChildIndex + mFirstPosition);
- } else {
- requestLayout();
- }
- }
通過debug發現,previouslyFocusedRect在這裡是ListView的,而不是之前焦點View的。在按向下鍵時,getDistance比較ListView的bottom和各個child的top,當然會選中離ListView下沿最近的。具體為什麼會previouslyFocusedRect是ListView,我還沒有深入分析。
一個解決辦法
這不是一個根本解決的方法:寫一個新的class,繼承ListView,覆蓋onFocusChanged。
- @Override
- protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
- super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
- if (gainFocus && previouslyFocusedRect != null) {
- final ListAdapter adapter = getAdapter();
- final int count = adapter.getCount();
- switch (direction) {
- case FOCUS_DOWN:
- for (int i = 0; i < count; i++) {
- if (!adapter.isEnabled(i)) {
- continue;
- }
- setSelection(i);
- break;
- }
- break;
- case FOCUS_UP:
- for (int i = count-1; i>=0; i--) {
- if (!adapter.isEnabled(i)) {
- continue;
- }
- setSelection(i);
- break;
- }
- break;
- default:
- break;
- }
- }
- }
在這裡,我只處理了FOCUS_DOWN和FOCUS_UP。由於不能訪問mFirstPosition,處理也做了簡化:焦點從上方移下來時選擇第一個能選擇的,從下方移上來時選擇最後一個能選擇的。
感謝:http://sunote.info/2010/02/25/android-move-focus-to-listview/
相關文章
- android:listView Button 焦點問題AndroidView
- Android ListView item中有按鈕(Button)不能點選或者條目不能點選的問題AndroidView
- android NestedScrollView和ListView衝突問題AndroidView
- svn 遷移到 git 的問題Git
- android listview 滾動時非同步載入圖片的問題AndroidView非同步
- Android的ListViewAndroidView
- 獲取文字框中焦點的位置 相容IE,FireFoxFirefox
- ScrollView與ListView合用問題(正確計算Listview的高度)View
- Android-GridView與ScrollView共用的衝突問題(類似ListView)AndroidView
- android中的ListViewAndroidView
- Android程式間的跳轉問題Android
- Android ListViewAndroidView
- Android裡透明的ListViewAndroidView
- android listview checkedTextView 的使用AndroidTextView
- 解決Flutter的ListView巢狀ListView滑動衝突以及無限高度問題FlutterView巢狀
- Android之ListViewAndroidView
- ListView Item 選擇問題解決之道View
- ListView的HeaderView包含的GridView滑動隱藏後無法點選問題分析ViewHeader
- 關於網路的一點問題(轉)
- 求助:Apache的問題請高手指點(轉)Apache
- 事務型系統由SQL遷移到NoSQL問題總結(轉)SQL
- 重寫ListView解決ListView內部ViewPaper滑動事件衝突問題View事件
- android:ListView 的簡單用法AndroidView
- android:定製 ListView 的介面AndroidView
- 【Android】ScrollView巢狀ListView只顯示第一行問題原理分析AndroidView巢狀
- android的listview的詳細用法AndroidView
- Android Activity跳轉閃屏問題Android
- android listview and scrollviewAndroidView
- android:ListView bbs DemoAndroidView
- Oracle遷移到PPAS(PostgreSQL)時的日期計算問題OracleSQL
- 從原理上說說ScrollView巢狀ListView的問題View巢狀
- 關於ListView的getView方法被多次重複呼叫的問題View
- 深度分析ORACLE熱點塊問題(轉)Oracle
- android:提升 ListView 的執行效率AndroidView
- 深度分析資料庫的熱點塊問題(轉)資料庫
- oracle 小數點前零丟失的問題<轉>Oracle
- JavaScript 專案遷移到 TypeScript 步驟以及遇到的問題JavaScriptTypeScript
- Android ListView元件樣式AndroidView元件