OSDN Git Service

Add Preference highlighting
authorFabrice Di Meglio <fdimeglio@google.com>
Wed, 16 Apr 2014 02:15:20 +0000 (19:15 -0700)
committerFabrice Di Meglio <fdimeglio@google.com>
Wed, 16 Apr 2014 23:01:13 +0000 (16:01 -0700)
- use a specific drawable for highlighting a Preference
at a given position
- also add PreferenceFragment.hasListView() as hidden API

Change-Id: If69854cf6c4852d0f45e2c3a9734b1f63b352f9d

core/java/android/preference/PreferenceFragment.java
core/java/android/preference/PreferenceGroupAdapter.java

index 11d8878..325b2e6 100644 (file)
@@ -337,6 +337,26 @@ public abstract class PreferenceFragment extends Fragment implements
         return mList;
     }
 
+    /** @hide */
+    public boolean hasListView() {
+        if (mList != null) {
+            return true;
+        }
+        View root = getView();
+        if (root == null) {
+            return false;
+        }
+        View rawListView = root.findViewById(android.R.id.list);
+        if (!(rawListView instanceof ListView)) {
+            return false;
+        }
+        mList = (ListView)rawListView;
+        if (mList == null) {
+            return false;
+        }
+        return true;
+    }
+
     private void ensureList() {
         if (mList != null) {
             return;
index c2e1f51..9b41ff0 100644 (file)
@@ -20,6 +20,8 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
 import android.os.Handler;
 import android.preference.Preference.OnPreferenceChangeInternalListener;
 import android.view.View;
@@ -91,7 +93,8 @@ public class PreferenceGroupAdapter extends BaseAdapter
         }
     };
 
-    private int mActivatedPosition = -1;
+    private int mHighlightedPosition = -1;
+    private Drawable mHighlightedDrawable;
 
     private static class PreferenceLayout implements Comparable<PreferenceLayout> {
         private int resId;
@@ -212,8 +215,18 @@ public class PreferenceGroupAdapter extends BaseAdapter
         return this.getItem(position).getId();
     }
 
-    public void setActivated(int position) {
-        mActivatedPosition = position;
+    /**
+     * @hide
+     */
+    public void setHighlighted(int position) {
+        mHighlightedPosition = position;
+    }
+
+    /**
+     * @hide
+     */
+    public void setHighlightedDrawable(Drawable drawable) {
+        mHighlightedDrawable = drawable;
     }
 
     public View getView(int position, View convertView, ViewGroup parent) {
@@ -227,7 +240,9 @@ public class PreferenceGroupAdapter extends BaseAdapter
             convertView = null;
         }
         View result = preference.getView(convertView, parent);
-        result.setActivated(position == mActivatedPosition);
+        if (position == mHighlightedPosition && mHighlightedDrawable != null) {
+            result.setBackgroundDrawable(mHighlightedDrawable);
+        }
         return result;
     }