安卓自带的Spinner不会用啊,换个图片都好麻烦,更别提做各种自定义的效果了
自己尝试着写了个能用的
给予一个控件点击事件,弹出PopupWindow,通过对PopupWindow内的控件设置点击事件,完成对其他界面的更新。
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有空再放