android自定义三级下拉,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即为图标点击事件中整个下拉框对象

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

使用下拉框布局文件中直接引入

代码中调用

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有空再放

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值