diff options
| author | Michael Kwan <mkwan@google.com> | 2016-07-22 18:37:31 -0700 |
|---|---|---|
| committer | Michael Kwan <mkwan@google.com> | 2016-07-26 10:57:56 -0700 |
| commit | 744be16ffa030cb62de13f633c124fc0e72d0181 (patch) | |
| tree | 6c869f4d23383e27eb742be20733776e6f5df056 /core/java/android | |
| parent | ad749416991e037fe6a875fa072c5bb8ed4c0a39 (diff) | |
Add titles to PreferenceFragments and PreferenceScreens for watches.
Preferences lack a title on watch type devices due to lack of ActionBar
support. A custom ListView was added to use a custom wrapper adapter to
add a persistent header view at the top of the ListView that developers
would not be able to remove via the ListView API.
Bug: 27962897
Change-Id: I6bccecf85592d9507e0c7a04c9a035617001e9ef
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/preference/PreferenceFragment.java | 16 | ||||
| -rw-r--r-- | core/java/android/preference/PreferenceScreen.java | 43 | ||||
| -rw-r--r-- | core/java/android/widget/ListView.java | 36 |
3 files changed, 83 insertions, 12 deletions
diff --git a/core/java/android/preference/PreferenceFragment.java b/core/java/android/preference/PreferenceFragment.java index d4a3582cfbf6..73fa01e59201 100644 --- a/core/java/android/preference/PreferenceFragment.java +++ b/core/java/android/preference/PreferenceFragment.java @@ -27,12 +27,14 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.text.TextUtils; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnKeyListener; import android.view.ViewGroup; import android.widget.ListView; +import android.widget.TextView; /** * Shows a hierarchy of {@link Preference} objects as @@ -366,6 +368,20 @@ public abstract class PreferenceFragment extends Fragment implements private void bindPreferences() { final PreferenceScreen preferenceScreen = getPreferenceScreen(); if (preferenceScreen != null) { + View root = getView(); + if (root != null) { + View titleView = root.findViewById(android.R.id.title); + if (titleView instanceof TextView) { + CharSequence title = preferenceScreen.getTitle(); + if (TextUtils.isEmpty(title)) { + titleView.setVisibility(View.GONE); + } else { + ((TextView) titleView).setText(title); + titleView.setVisibility(View.VISIBLE); + } + } + } + preferenceScreen.bind(getListView()); } onBindPreferences(); diff --git a/core/java/android/preference/PreferenceScreen.java b/core/java/android/preference/PreferenceScreen.java index b1317e656e3e..2305b0564e49 100644 --- a/core/java/android/preference/PreferenceScreen.java +++ b/core/java/android/preference/PreferenceScreen.java @@ -19,6 +19,8 @@ package android.preference; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; @@ -31,6 +33,7 @@ import android.widget.Adapter; import android.widget.AdapterView; import android.widget.ListAdapter; import android.widget.ListView; +import android.widget.TextView; /** * Represents a top-level {@link Preference} that @@ -91,13 +94,33 @@ public final class PreferenceScreen extends PreferenceGroup implements AdapterVi private Dialog mDialog; private ListView mListView; - + + private int mLayoutResId = com.android.internal.R.layout.preference_list_fragment; + private Drawable mDividerDrawable; + private boolean mDividerSpecified; + /** * Do NOT use this constructor, use {@link PreferenceManager#createPreferenceScreen(Context)}. * @hide- */ public PreferenceScreen(Context context, AttributeSet attrs) { super(context, attrs, com.android.internal.R.attr.preferenceScreenStyle); + + TypedArray a = context.obtainStyledAttributes(null, + com.android.internal.R.styleable.PreferenceScreen, + com.android.internal.R.attr.preferenceScreenStyle, + 0); + + mLayoutResId = a.getResourceId( + com.android.internal.R.styleable.PreferenceScreen_screenLayout, + mLayoutResId); + if (a.hasValueOrEmpty(com.android.internal.R.styleable.PreferenceScreen_divider)) { + mDividerDrawable = + a.getDrawable(com.android.internal.R.styleable.PreferenceScreen_divider); + mDividerSpecified = true; + } + + a.recycle(); } /** @@ -163,18 +186,30 @@ public final class PreferenceScreen extends PreferenceGroup implements AdapterVi LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - View childPrefScreen = inflater.inflate( - com.android.internal.R.layout.preference_list_fragment, null); + View childPrefScreen = inflater.inflate(mLayoutResId, null); + View titleView = childPrefScreen.findViewById(android.R.id.title); mListView = (ListView) childPrefScreen.findViewById(android.R.id.list); + if (mDividerSpecified) { + mListView.setDivider(mDividerDrawable); + } + bind(mListView); // Set the title bar if title is available, else no title bar final CharSequence title = getTitle(); Dialog dialog = mDialog = new Dialog(context, context.getThemeResId()); if (TextUtils.isEmpty(title)) { + if (titleView != null) { + titleView.setVisibility(View.GONE); + } dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); } else { - dialog.setTitle(title); + if (titleView instanceof TextView) { + ((TextView) titleView).setText(title); + titleView.setVisibility(View.VISIBLE); + } else { + dialog.setTitle(title); + } } dialog.setContentView(childPrefScreen); dialog.setOnDismissListener(this); diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index 8f908fb85444..b0f19d7a0b49 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -112,8 +112,8 @@ public class ListView extends AbsListView { public boolean isSelectable; } - private ArrayList<FixedViewInfo> mHeaderViewInfos = Lists.newArrayList(); - private ArrayList<FixedViewInfo> mFooterViewInfos = Lists.newArrayList(); + ArrayList<FixedViewInfo> mHeaderViewInfos = Lists.newArrayList(); + ArrayList<FixedViewInfo> mFooterViewInfos = Lists.newArrayList(); Drawable mDivider; int mDividerHeight; @@ -279,7 +279,7 @@ public class ListView extends AbsListView { // Wrap the adapter if it wasn't already wrapped. if (mAdapter != null) { if (!(mAdapter instanceof HeaderViewListAdapter)) { - mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter); + wrapHeaderListAdapterInternal(); } // In the case of re-adding a header view, or adding one later on, @@ -373,7 +373,7 @@ public class ListView extends AbsListView { // Wrap the adapter if it wasn't already wrapped. if (mAdapter != null) { if (!(mAdapter instanceof HeaderViewListAdapter)) { - mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter); + wrapHeaderListAdapterInternal(); } // In the case of re-adding a footer view, or adding one later on, @@ -476,7 +476,7 @@ public class ListView extends AbsListView { mRecycler.clear(); if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) { - mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter); + mAdapter = wrapHeaderListAdapterInternal(mHeaderViewInfos, mFooterViewInfos, adapter); } else { mAdapter = adapter; } @@ -2228,7 +2228,7 @@ public class ListView extends AbsListView { * after the header views. */ public void setSelectionAfterHeaderView() { - final int count = mHeaderViewInfos.size(); + final int count = getHeaderViewsCount(); if (count > 0) { mNextSelectedPosition = 0; return; @@ -3356,7 +3356,7 @@ public class ListView extends AbsListView { bounds.right = mRight - mLeft - mPaddingRight; final int count = getChildCount(); - final int headerCount = mHeaderViewInfos.size(); + final int headerCount = getHeaderViewsCount(); final int itemCount = mItemCount; final int footerLimit = (itemCount - mFooterViewInfos.size()); final boolean headerDividers = mHeaderDividersEnabled; @@ -3940,7 +3940,7 @@ public class ListView extends AbsListView { if (drawDividers) { final boolean fillForMissingDividers = isOpaque() && !super.isOpaque(); final int itemCount = mItemCount; - final int headerCount = mHeaderViewInfos.size(); + final int headerCount = getHeaderViewsCount(); final int footerLimit = (itemCount - mFooterViewInfos.size()); final boolean isHeader = (itemIndex < headerCount); final boolean isFooter = (itemIndex >= footerLimit); @@ -4052,4 +4052,24 @@ public class ListView extends AbsListView { encoder.addProperty("recycleOnMeasure", recycleOnMeasure()); } + + /** @hide */ + protected HeaderViewListAdapter wrapHeaderListAdapterInternal( + ArrayList<ListView.FixedViewInfo> headerViewInfos, + ArrayList<ListView.FixedViewInfo> footerViewInfos, + ListAdapter adapter) { + return new HeaderViewListAdapter(headerViewInfos, footerViewInfos, adapter); + } + + /** @hide */ + protected void wrapHeaderListAdapterInternal() { + mAdapter = wrapHeaderListAdapterInternal(mHeaderViewInfos, mFooterViewInfos, mAdapter); + } + + /** @hide */ + protected void dispatchDataSetObserverOnChangedInternal() { + if (mDataSetObserver != null) { + mDataSetObserver.onChanged(); + } + } } |
