实例介绍
【实例简介】
【实例截图】
【核心代码】
package com.example.spinnerbuttondemo; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.LinearLayout.LayoutParams; import android.widget.PopupWindow; /** * @ClassName SpinnerButton * @Description TODO 防android4.0 Spinner下拉效果 * @author kenny * @date 2012-8-14 */ public class SpinnerButton extends Button { private Context mContext; /** 下拉PopupWindow */ private UMSpinnerDropDownItems mPopupWindow; /** 下拉布局文件ResourceId */ private int mResId; /** 下拉布局文件创建监听器 */ private ViewCreatedListener mViewCreatedListener; public SpinnerButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initButton(context); } public SpinnerButton(Context context, AttributeSet attrs) { super(context, attrs); initButton(context); } public SpinnerButton(Context context, final int resourceId, ViewCreatedListener mViewCreatedListener) { super(context); setResIdAndViewCreatedListener(resourceId, mViewCreatedListener); initButton(context); } private void initButton(Context context) { this.mContext = context; // UMSpinnerButton监听事件 setOnClickListener(new UMSpinnerButtonOnClickListener()); } public PopupWindow getPopupWindow() { return mPopupWindow; } public void setPopupWindow(UMSpinnerDropDownItems mPopupWindow) { this.mPopupWindow = mPopupWindow; } public int getResId() { return mResId; } /** * @Description: TODO 隐藏下拉布局 */ public void dismiss(){ mPopupWindow.dismiss(); } /** * @Description: TODO 设置下拉布局文件,及布局文件创建监听器 * @param @param mResId 下拉布局文件ID * @param @param mViewCreatedListener 布局文件创建监听器 */ public void setResIdAndViewCreatedListener(int mResId, ViewCreatedListener mViewCreatedListener) { this.mViewCreatedListener = mViewCreatedListener; // 下拉布局文件id this.mResId = mResId; // 初始化PopupWindow mPopupWindow = new UMSpinnerDropDownItems(mContext); } /** * UMSpinnerButton的点击事件 */ class UMSpinnerButtonOnClickListener implements View.OnClickListener { @Override public void onClick(View v) { if (mPopupWindow != null) { if (!mPopupWindow.isShowing()) { // 设置PopupWindow弹出,退出样式 mPopupWindow.setAnimationStyle(R.style.Animation_dropdown); // 计算popupWindow下拉x轴的位置 int lx = (SpinnerButton.this.getWidth() - mPopupWindow.getmViewWidth() - 7) / 2; // showPopupWindow mPopupWindow.showAsDropDown(SpinnerButton.this, lx, -5); } } } } /** * @ClassName UMSpinnerDropDownItems * @Description TODO 下拉界面 * @author kenny * @date 2012-8-14 */ public class UMSpinnerDropDownItems extends PopupWindow { private Context mContext; /** 下拉视图的宽度 */ private int mViewWidth; /** 下拉视图的高度 */ private int mViewHeight; public UMSpinnerDropDownItems(Context context) { super(context); this.mContext = context; loadViews(); } /** * @Description: TODO 加载布局文件 * @param * @return void * @throws */ private void loadViews() { // 布局加载器加载布局文件 LayoutInflater inflater = LayoutInflater.from(mContext); final View v = inflater.inflate(mResId, null); // 计算view宽高 onMeasured(v); // 必须设置 setWidth(LayoutParams.WRAP_CONTENT); setHeight(LayoutParams.WRAP_CONTENT); setContentView(v); setFocusable(true); // 设置布局创建监听器,以便在实例化布局控件对象 if (mViewCreatedListener != null) { mViewCreatedListener.onViewCreated(v); } } /** * @Description: TODO 计算View长宽 * @param @param v */ private void onMeasured(View v) { int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); v.measure(w, h); mViewWidth = v.getMeasuredWidth(); mViewHeight = v.getMeasuredHeight(); } public int getmViewWidth() { return mViewWidth; } public void setmViewWidth(int mViewWidth) { this.mViewWidth = mViewWidth; } public int getmViewHeight() { return mViewHeight; } public void setmViewHeight(int mViewHeight) { this.mViewHeight = mViewHeight; } } /** * @ClassName ViewCreatedListener * @Description TODO 布局创建监听器,实例化布局控件对象 * @author kenny * @date 2012-8-15 */ public interface ViewCreatedListener { void onViewCreated(View v); } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论