安卓常用 widget

验证码

public class SpinnerImg extends ImageView {
    /**
     * 完成选择后启动另外一个spinner
     */
    private ItemListener itemListener;
    private Context mContext;
    /** 下拉PopupWindow */
    private UMSpinnerDropDownItems mPopupWindow;
    /** 下拉布局文件 */
    private LinearLayout layout;
    /** 下拉布局文件创建监听器 */
    private ViewCreatedListener mViewCreatedListener;

    public SpinnerImg(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initButton(context);
    }

    public SpinnerImg(Context context, AttributeSet attrs) {
        super(context, attrs);
        initButton(context);
    }

    public SpinnerImg(Context context, final LinearLayout layout,
            ViewCreatedListener mViewCreatedListener) {
        super(context);
        setResIdAndViewCreatedListener(layout, 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 LinearLayout getResId() {
        return layout;
    }

    /**
     * @Description: TODO 隐藏下拉布局
     */
    public void dismiss() {
        mPopupWindow.dismiss();
    }

    /**
     * @Description: TODO 设置下拉布局文件,及布局文件创建监听器
     * @param @param mResId 下拉布局文件ID
     * @param @param mViewCreatedListener 布局文件创建监听器
     */
    public void setResIdAndViewCreatedListener(LinearLayout layout,
            ViewCreatedListener mViewCreatedListener) {
        this.mViewCreatedListener = mViewCreatedListener;
        // 下拉布局文件id
        this.layout = layout;
        // 初始化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 = (SpinnerImg.this.getWidth()
                            - mPopupWindow.getmViewWidth() - 7) / 2;
                    // showPopupWindow
                    mPopupWindow.showAsDropDown(SpinnerImg.this, lx, -5);
                }
            }
        }
    }

    /**
     * @ClassName UMSpinnerDropDownItems
     * @Description TODO 下拉界面
     */
    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() {
            // 布局加载器加载布局文件
            final View v = layout;
            // 计算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);
    }

    public void handleClick(int position) {
        this.dismiss();
        itemListener.endItemSelect(position);
    }

    public void setFinishListener(ItemListener itemListener) {
        this.itemListener = itemListener;
    }

    // 接口回调数据
    public static interface ItemListener {
        void endItemSelect(int position);
    }

    /**
     *
     * @param arryList
     *            spinner里面的数组
     * @param whichSpinner
     *            这个是哪个spinner被选择的
     *
     */
    public void loadListData(final LinkedList<String[]> arryList) {
        this.setResIdAndViewCreatedListener(creatlayout(arryList),
                new SpinnerImg.ViewCreatedListener() {
                    @Override
                    public void onViewCreated(View v) {

                        for (int i = 0; i < arryList.size(); i++) {
                            layout.getChildAt(i).setOnClickListener(
                                    new View.OnClickListener() {
                                        @Override
                                        public void onClick(View v) {
                                            SpinnerImg.this.handleClick(Integer
                                                    .valueOf(v.getTag()
                                                            .toString()));
                                        }
                                    });
                            layout.getChildAt(i).setTag(i);
                        }
                    }
                });
    }

    /**
     * 创建列表布局
     *
     */
    public LinearLayout creatlayout(LinkedList<String[]> arryList) {
        LinearLayout layout = new LinearLayout(getContext());
        layout.setOrientation(LinearLayout.VERTICAL);
        layout.setBackgroundColor(Color.WHITE);
        for (int i = 0; i < arryList.size(); i++) {
            TextView tv = new TextView(getContext());
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    OnlyYouHelpMe.Dp2Px(getContext(), 100),
                    OnlyYouHelpMe.Dp2Px(getContext(), 40));
            tv.setLayoutParams(params);
            tv.setTextColor(Color.BLACK);
            tv.setGravity(Gravity.CENTER);
            Drawable drawable = getResources().getDrawable(R.drawable.line_absolute);
            Drawable bg = getResources().getDrawable(R.drawable.bg_text_gray);
            tv.setBackgroundDrawable(bg);
            drawable.setBounds(0, 0, drawable.getMinimumWidth(),
                    drawable.getMinimumHeight());
            tv.setCompoundDrawables(null, null, null, drawable);
            tv.setPadding(5, 0, 5, 0);
            tv.setText(arryList.get(i)[0]);
            layout.addView(tv);
        }
        return layout;
    }

}

时间: 2024-10-05 11:40:26

安卓常用 widget的相关文章

安卓常用布局

在安卓开发中我们常用的布局方式有这么几种: 1.LinearLayout ( 线性布局 ) :(里面只可以有一个控件,并且不能设计这个控件的位置,控件会放到左上角) 线性布局分为水平线性和垂直线性二者的属性分别为: android:orientation= " horizontal " android:orientation= "vertical" . 2.RelativeLayout ( 相对布局 ) : (里面可以放多个控件,但是一行只能放一个控件) 附加几类 

安卓常用的布局

上完课后,我发现我对安卓的布局很感兴趣,因为UI是最能给我们直观感受的,人人都想追求一个美观的程序.课后我对照书然后网上查找资料大致的总结了一下. 在android中我们常用的布局方式有这么几种:LinearLayout (线性布局),RelativeLayout (相对布局),TableLayout (表格布局),AbsoluteLayout (绝对布局),FrameLayout (帧布局).不过我发现一般把framelayout做容器,不当布局来看待,因为没法单独完成一个布局.从代码数量来看

安卓常用Layout

/*---------------------------------------- *-描述--Layout的几点总结. *-描述--S1.安卓的五大布局: * LinearLayout(线性布局):常用 * RelativeLayout(相对布局):常用 * FrameLayout(框架布局):常用 * GridLayout(网格布局)[4.0之后新增网格布局]:使用较少 * TableLayout(表格布局):几乎不用. *-描述--S2.. *-描述--S3.. *-描述--None.

安卓常用实用功能代码片大全(长期更新)

看别人博客,有些小技巧就直接转过来了,以后做开发可以大大提高开发效率.以下代码片摘自多个博客和自己平时的学习积累,若原作者认为侵犯著作权,请私信告知,我看到后讲第一时间删除. 一.  获取系统版本号: PackageInfo info = this.getPackageManager().getPackageInfo(this.getPackageName(), 0); int versionCode=nfo.versionCode string versionName=info.version

安卓常用布局与使用场景

常用的有三种   LinearLayout 线性布局   RelativeLayout相对布局  FrameLayout帧布局 特点: LinearLayout 线性布局    -->  1,默认是水平布局"horizontal"   可以设置为"vertical"  垂直布局   2,很有条理,写出来的布局比较直观,适合简单的页面布局 缺点-->  横平竖直,不能随意设置 RelativeLayout相对布局   -->   1.默认位置为屏幕右

安卓常用布局控件、监听器总结

来源于http://blog.csdn.net/u013901909/article/details/50051615 布局管理器 名称 作用 要点 特点 总结 备注 LinearLayout 线性布局 控制组件 横向 或者 纵向 排列 android:layout_gravity 是控制组件本身的对齐方式, android:gravity是控制本容器子组件的对齐方式; 适用性强 傻瓜式的依次顺序布局   RelativeLayout 相对布局 子组件的位置总是相对兄弟组件,父容器来决定的 (1

安卓常用类

处理全局异常类 Android系统的“程序异常退出”,给应用的用户体验造成不良影响.为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理.通过Thread.setDefaultUncaughtExceptionHandler()方法将异常处理类设置到线程上即可. import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import ja

安卓常用控件

在android中,文本控件主要包括TextView控件和EditView控件,本节先对TextView控件的用法进行详细介绍. 1. TextView类继承自View类,TextView控件的功能是向用户显示文本的内容,但不允许编辑,而其子类EditView允许用户进行编辑. TextView常用属性及对应方法说明 2. EditView类继承自TextView类,EditView与TextView最大的不同就是用户可以对EditView控件进行编辑,同时还可以为EditView控件设置监听器

Android的Context &amp;&amp; 安卓常用系统服务(当前运行包名/当前网络状态和开关网络/音频服务/马达服务) (转)

转:http://blog.csdn.net/zhandoushi1982/article/details/8501773 Context字面意思上下文,位于framework 的android.content.Context中.其实该类为LONG型,类似Win32中的Handle句柄,很多方法需要通过Context才能 得到调用者的实例,比如说Toast的第一个参数就是Context,一般在Activity中我们直接用this代替:而到了一个button的 onClick(View view)