有时候因为项目的界面风格 很多控件如果使用原生的样式感觉会与整体风格有些不搭 所以需要自定义样式 很多项目中自定义控件都是必不可少的 这里参考网上的一些资料 实现了一个自定义Spinner 记录下 加深印象
效果图:
弹框是通过一个重写的Dialog和Listview实现
第一步 重写Dialog类SelectDialog.java
[java] copy
import import import public SelectDialog AlertDialog {
- SelectDialog(Context context, theme) {
- (context, theme);
- SelectDialog(Context context) {
- (context);
- onCreate(Bundle savedInstanceState) {
- .onCreate(savedInstanceState);
- }
第二步重写Spinner类CustomerSpinner.java
[java] copy
import
import
import
import
import
import
import
import
import
public CustomerSpinner Spinner OnItemClickListener {
- SelectDialog dialog = ;
- ArrayList<String> list;
- String text;
- CustomerSpinner(Context context, AttributeSet attrs) {
- (context, attrs);
- performClick() {
- LayoutInflater inflater = LayoutInflater.from(getContext());
- View view = inflater.inflate(R.layout.formcustomspinner, );
- ListView listview = (ListView) view
- ListviewAdapter(context, getList());
- );
- SelectDialog(context, R.style.dialog);
- LayoutParams params = LayoutParams(, LayoutParams.FILL_PARENT);
- );
- dialog.show();
- ;
- onItemClick(AdapterView<?> view, View itemView, position,
- id) {
- setSelection(position);
- (dialog != ) {
- ;
- ArrayList<String> getList() {
- list;
- }
- setList(ArrayList<String> list) {
- .list = list;
- }
- String getText() {
- text;
- }
- setText(String text) {
- .text = text;
- }
- }
这里用Listview来显示数据 ArrayList<String> list存储所要显示的数据 text存储每次spinner选中的值 在监听spinner并获取当前选中的值的时候用到
dialog的样式设置:styles.xml
[html] copy
<? = =?>
<>
= =>
=></>
- =></>
- =></>
- =></>
- =></>
- >
</>
Listview的代码很简单 自己写一个adapter就好了
第三步 在xml文件中引用自定义的spinner
main.xml
[html] copy
<? = =?>
< =
- = =
- = = =
- = =
- == =
- =/>
= - = = =
- =/>
</>
到这里差不多就完成了 不过这个还有个缺陷 每次使用时通过 spinner.setList(list);为其加载数据 当程序返回或者退出这个节目在进入时 listview中的数据会重复 这里只能通过这个办法来解决了
[html] copy
@Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- == KeyEvent.KEYCODE_BACK){
- list.clear();
- }
每次返回或退出时 清空list 就可以啦
下载地址:http://download.csdn.net/download/wanglj0925/4634852