Android自定义下拉框的简单实现

安卓自带的Spinner不会用啊,换个图片都好麻烦,更别提做各种自定义的效果了

自己尝试着写了个能用的

  • 实现思路:

给予一个控件点击事件,弹出PopupWindow,通过对PopupWindow内的控件设置点击事件,完成对其他界面的更新。

  • 具体实现:
1.自定义控件(这里使用LinearLayout,在线性布局末尾添加一个ImageView,并对ImageView设置)
public class CustomSpinner extends LinearLayout {
      private ImageView img;
      public CustomSpinner( Context context ) {
            super( context );
      }
      
      public CustomSpinner( Context context,
                  @Nullable AttributeSet attrs ) {
            super( context, attrs );
      }
      
      public CustomSpinner( Context context, @Nullable AttributeSet attrs, int defStyleAttr ) {
            super( context, attrs, defStyleAttr );
      }
//布局文件读取之后
      @Override protected void onFinishInflate() {
            super.onFinishInflate();
            init();
      }
      
      private void init() {
            setOrientation( HORIZONTAL );
            img = new ImageView( MyApplication.getInstance().getContext() );
            img.setImageResource( R.drawable.xxx );
            LinearLayout.LayoutParams params =
                        new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT,
                                    LayoutParams.WRAP_CONTENT );
            //new LinearLayout.LayoutParams( 1, getHeight() );
            params.gravity = Gravity.END;
            params.rightMargin = 5;
            addView( img, params );
}
}

2.实现下拉框

下拉框具体教程很多,这里做最简单的实现,为了方便控制,在Custom中添加一个私有变量

      private PopupWindow pw;

以及一个下拉框的布局并暴露设置方法

      private int layout = R.layout.default_popwindow;
      //设置下拉框布局
      public void setLayout( int layout ) {
            this.layout = layout;
      }

然后为图标添加点击事件:

            img.setOnClickListener( new OnClickListener() {
                  @Override public void onClick( View view ) {
                        //弹出下拉框
                        View v = LayoutInflater.from( MyApplication.getInstance().getContext() )
                                    .inflate( layout, null );
                        //下拉框宽度与CustomSpinner一致,高度为400
                        pw = new PopupWindow( v, getWidth(), 400, true );
                        //在CustomSpinner下弹出
                        pw.showAsDropDown( (View) img.getParent() );
                  }
            } );

3.添加回调接口,用于处理下拉框的点击事件

      private onSpinnerClickListener listener;
      
      /**
       * 通过回调接口传递下拉框对象
       * 以供添加其他事件
       */
      public interface onSpinnerClickListener {
            void setPopupWindow( View view );
      }
      //设置回调接口
      public void setListener( onSpinnerClickListener listener ) {
            this.listener = listener;
      }

然后在图标的点击事件中,下拉框弹出之后,调用接口中设置的方法

      //当下拉框出现时,传递整个下拉框对象
      listener.setPopupWindow( v );

v即为图标点击事件中整个下拉框对象

至此,整个下拉框控件准备完毕

  • 使用下拉框
布局文件中直接引入
        <xxx.widget.CustomSpinner
                android:id="@+id/cs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
        <TextView
                android:id="@+id/tv"
                android:textColor="@android:color/black"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"/>
        </xxx.widget.CustomSpinner>

代码中调用

            CustomSpinner cs = findViewById( R.id.cs );

设置下拉框布局

            cs.setLayout(R.layout.xxx);

设置监听

            cs.setListener( new CustomSpinner.onSpinnerClickListener() {
                  @Override public void setPopupWindow( View view ) {
                   //获得你下拉框布局中想要的控件
                   View v = view.findViewById( R.id.xxx );
                   //为该控件设置点击事件                      
                   v.setOnClickListener( new View.OnClickListener() {
                              @Override public void onClick( View view ) {
                                 //设置点击之后的效果
                              }
                        } );
                  }
            } );

完毕

理论上可以实现任意样式的下拉框

可能存在的问题:

      设置img时使用了自定义的Application,传入context即可。

Demo有空再放


  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值