/* * Copyright (C) 2010 mAPPn.Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.mappn.gfan.common.widget; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.res.TypedArray; import android.database.DataSetObserver; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ListAdapter; import android.widget.SpinnerAdapter; import com.mappn.gfan.R; /** * 带title的Spinner * * @author libin * @date 2010-12-22 * @since Version 0.5.0 */ public class TitleSpinner extends Button implements OnClickListener { private CharSequence mPrompt; private SpinnerAdapter adapter; private int mNextSelectedPosition; private android.content.DialogInterface.OnClickListener mOnClickListener; public TitleSpinner(Context context) { super(context); mNextSelectedPosition = -1; setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); setBackgroundResource(android.R.drawable.btn_dropdown); } public TitleSpinner(Context context, AttributeSet attrs) { super(context, attrs); mNextSelectedPosition = -1; setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); setBackgroundResource(android.R.drawable.btn_dropdown); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TitleSpinner); if (a.hasValue(R.styleable.TitleSpinner_prompt)) { mPrompt = a.getString(R.styleable.TitleSpinner_prompt); } a.recycle(); } public TitleSpinner(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mNextSelectedPosition = -1; setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); setBackgroundResource(android.R.drawable.btn_dropdown); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TitleSpinner); if (a.hasValue(R.styleable.TitleSpinner_prompt)) { mPrompt = a.getString(R.styleable.TitleSpinner_prompt); } a.recycle(); } public int getSelectedItemPosition() { return mNextSelectedPosition; } public void setSelection(int position) { mNextSelectedPosition = position; setText(adapter.getItem(position).toString()); // Theme theme = this.getContext().getTheme(); // TypedValue tv = new TypedValue(); // if (theme.resolveAttribute(android.R.attr.textColorSecondary, tv, // true)) // setTextColorthis.getContext().getResources().getColor(tv.resourceId)t); //setTextColor(android.R.color.primary_text_light); } public void setAdapter(SpinnerAdapter adapter) { this.adapter = adapter; } @Override public void onClick(DialogInterface dialog, int which) { setSelection(which); dialog.dismiss(); if (mOnClickListener != null) mOnClickListener.onClick(dialog, which); } @Override public boolean performClick() { boolean handled = super.performClick(); if (!handled) { handled = true; AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); if (mPrompt != null) { builder.setTitle(mPrompt); } builder.setSingleChoiceItems(new DropDownAdapter(adapter), getSelectedItemPosition(), this).show(); } return handled; } public void setOnClickListener(android.content.DialogInterface.OnClickListener listener) { mOnClickListener = listener; } /** * <p> * Wrapper class for an Adapter. Transforms the embedded Adapter instance * into a ListAdapter. * </p> */ private static class DropDownAdapter implements ListAdapter, SpinnerAdapter { private SpinnerAdapter mAdapter; private ListAdapter mListAdapter; /** * <p> * Creates a new ListAdapter wrapper for the specified adapter. * </p> * * @param adapter * the Adapter to transform into a ListAdapter */ public DropDownAdapter(SpinnerAdapter adapter) { this.mAdapter = adapter; if (adapter instanceof ListAdapter) { this.mListAdapter = (ListAdapter) adapter; } } public int getCount() { return mAdapter == null ? 0 : mAdapter.getCount(); } public Object getItem(int position) { return mAdapter == null ? null : mAdapter.getItem(position); } public long getItemId(int position) { return mAdapter == null ? -1 : mAdapter.getItemId(position); } public View getView(int position, View convertView, ViewGroup parent) { return getDropDownView(position, convertView, parent); } public View getDropDownView(int position, View convertView, ViewGroup parent) { return mAdapter == null ? null : mAdapter.getDropDownView(position, convertView, parent); } public boolean hasStableIds() { return mAdapter != null && mAdapter.hasStableIds(); } public void registerDataSetObserver(DataSetObserver observer) { if (mAdapter != null) { mAdapter.registerDataSetObserver(observer); } } public void unregisterDataSetObserver(DataSetObserver observer) { if (mAdapter != null) { mAdapter.unregisterDataSetObserver(observer); } } /** * If the wrapped SpinnerAdapter is also a ListAdapter, delegate this * call. Otherwise, return true. */ public boolean areAllItemsEnabled() { final ListAdapter adapter = mListAdapter; if (adapter != null) { return adapter.areAllItemsEnabled(); } else { return true; } } /** * If the wrapped SpinnerAdapter is also a ListAdapter, delegate this * call. Otherwise, return true. */ public boolean isEnabled(int position) { final ListAdapter adapter = mListAdapter; if (adapter != null) { return adapter.isEnabled(position); } else { return true; } } public int getItemViewType(int position) { return 0; } public int getViewTypeCount() { return 1; } public boolean isEmpty() { return getCount() == 0; } } public void setPrompt(CharSequence prompt) { mPrompt = prompt; } }