文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android中怎么自定义选择控件

2023-05-30 23:34

关注

本篇文章为大家展示了Android中怎么自定义选择控件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

一、自定义Dialog

Dialog布局文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="vertical">  <LinearLayout    android:layout_width="wrap_content"    android:layout_weight="1"    android:background="@drawable/dialog_bg"    android:layout_height="match_parent"    android:orientation="vertical" >    <RelativeLayout      android:layout_width="match_parent"      android:layout_height="50dp">      <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="20dp"        android:layout_centerVertical="true"        android:textSize="18sp"        android:textColor="#000000"        android:id="@+id/tv_dialog_select_title"/>      <ImageButton        android:layout_width="50dp"        android:layout_height="match_parent"        android:padding="8dp"        android:layout_marginRight="10dp"        android:layout_centerVertical="true"        android:layout_alignParentRight="true"        android:scaleType="centerInside"        android:background="@color/transparent"        android:src="@drawable/im_search_back"        android:id="@+id/btn_dialog_select_search"/>    </RelativeLayout>    <com.whieenz.searchselect.DialogSearchView      android:layout_width="match_parent"      android:layout_height="wrap_content"      android:id="@+id/searchView"      android:visibility="gone"/>    <ListView      android:layout_width="match_parent"      android:layout_height="0dp"      android:layout_weight="1"      android:orientation="vertical"      android:id="@+id/listview"      android:layout_gravity="center_horizontal" />  </LinearLayout>  <LinearLayout    android:layout_width="match_parent"    android:layout_height="80dp"    android:gravity="center"    android:background="@color/transparent">    <ImageButton      android:layout_width="40dp"      android:layout_height="40dp"      android:id="@+id/imb_dialog_select_close"      android:scaleType="centerInside"      android:src="@drawable/dialog_close"      android:background="@color/transparent"/>  </LinearLayout></LinearLayout>

Dialog Java文件

package com.whieenz.searchselect;import android.app.Activity;import android.app.Dialog;import android.content.Context;import android.content.DialogInterface;import android.util.DisplayMetrics;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.Window;import android.view.WindowManager;import android.widget.AdapterView;import android.widget.ImageButton;import android.widget.ListView;import android.widget.TextView;import java.util.ArrayList;import java.util.List;public class SerachSelectDialog extends Dialog {  public SerachSelectDialog(Context context, int themeResId) {    super(context, themeResId);  }    public void setDialogWindowAttr(double x, double y, Activity activity){    if (x<0||x>1||y<0||y>1){      return;    }    Window window = this.getWindow();    WindowManager.LayoutParams lp = window.getAttributes();    WindowManager manager = activity.getWindowManager();    DisplayMetrics outMetrics = new DisplayMetrics();    manager.getDefaultDisplay().getMetrics(outMetrics);    int width = outMetrics.widthPixels;    int height = outMetrics.heightPixels;    lp.gravity = Gravity.CENTER;    lp.width = (int) (width * x);    lp.height = (int) (height * y);    this.getWindow().setAttributes(lp);  }  public static class Builder {    private String title;    private View contentView;    private String positiveButtonText;    private String negativeButtonText;    private String singleButtonText;    private List<String> listData;    private View.OnClickListener positiveButtonClickListener;    private View.OnClickListener negativeButtonClickListener;    private View.OnClickListener singleButtonClickListener;    private View layout;    private Context context;    private SerachSelectDialog dialog;    private OnSelectedListiner selectedListiner;    ListView listView;    //SearchView searchView ;    DialogSearchView searchView;    ImageButton searchBtn;    ImageButton closeBtn;    TextView titleView;    private boolean state = false;    public Builder(Context context) {      //这里传入自定义的style,直接影响此Dialog的显示效果。style具体实现见style.xml      this.context = context;      dialog = new SerachSelectDialog(context,R.style.selectDialog);      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);      layout = inflater.inflate(R.layout.dialog_select_search, null);      listView = (ListView)layout.findViewById(R.id.listview);      //searchView = (SearchView) layout.findViewById(R.id.searchView);      searchView = (DialogSearchView) layout.findViewById(R.id.searchView);      searchBtn = (ImageButton) layout.findViewById(R.id.btn_dialog_select_search);      closeBtn = (ImageButton) layout.findViewById(R.id.imb_dialog_select_close);      titleView = (TextView) layout.findViewById(R.id.tv_dialog_select_title);      dialog.addContentView(layout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));    }    public Builder setTitle(String title) {      this.title = title;      return this;    }    public Builder setContentView(View v) {      this.contentView = v;      return this;    }    public void setListData(List<String> listData) {      this.listData = listData;    }    public Builder setPositiveButton(String positiveButtonText, View.OnClickListener listener) {      this.positiveButtonText = positiveButtonText;      this.positiveButtonClickListener = listener;      return this;    }    public Builder setNegativeButton(String negativeButtonText, View.OnClickListener listener) {      this.negativeButtonText = negativeButtonText;      this.negativeButtonClickListener = listener;      return this;    }        private SerachSelectDialog create() {      titleView.setText(title);      final SearchSelectAdapter sa = new SearchSelectAdapter(context,listData);      listView.setAdapter(sa);      listView.invalidate();      searchBtn.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View view) {          if (!state){            searchView.setVisibility(View.VISIBLE);            state = true;          }else {            searchView.setVisibility(View.GONE);            state = false;          }        }      });      searchView.setDialogSearchViewListener(new DialogSearchView.DialogSearchViewListener() {        @Override        public boolean onQueryTextChange(String text) {          updateLayout(searchItem(text));          return false;        }      });      closeBtn.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {          dialog.dismiss();        }      });      dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {        @Override        public void onDismiss(DialogInterface dialog) {        }      });      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {        @Override        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {          selectedListiner.onSelected(sa.getItem(position));          dialog.dismiss();        }      });      dialog.setContentView(layout);      //用户可以点击手机Back键取消对话框显示      dialog.setCancelable(true);      //用户不能通过点击对话框之外的地方取消对话框显示      dialog.setCanceledOnTouchOutside(false);      return dialog;    }    public List<String> searchItem(String name) {      ArrayList<String> mSearchList = new ArrayList<String>();      for (int i = 0; i < listData.size(); i++) {        int index = listData.get(i).indexOf(name);        // 存在匹配的数据        if (index != -1) {          mSearchList.add(listData.get(i));        }      }      return mSearchList;    }    public void updateLayout(List<String> newList) {      final SearchSelectAdapter sa = new SearchSelectAdapter(context,newList);      listView.setAdapter(sa);      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {        @Override        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {          selectedListiner.onSelected(sa.getItem(position));          dialog.dismiss();        }      });    }    public void setSelectedListiner(SerachSelectDialog.Builder.OnSelectedListiner selectedListiner) {      this.selectedListiner = selectedListiner;    }    public static abstract class OnSelectedListiner{      public abstract void onSelected(String String);    }    public SerachSelectDialog show() {      create();      dialog.show();      return dialog;    }  }}

二、自定义SearchView

SearchView 布局文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:orientation="vertical"  android:layout_width="match_parent"  android:gravity="center"  android:background="#ffffff"  android:layout_height="50dp">    <LinearLayout      android:layout_width="match_parent"      android:layout_height="35dp"      android:orientation="horizontal"      android:gravity="center_vertical"      android:layout_marginLeft="15dp"      android:layout_marginRight="15dp"      android:background="@drawable/search_layout_bg">      <ImageButton        android:layout_width="20dp"        android:layout_height="20dp"        android:id="@+id/imb_search_search"        android:layout_marginLeft="15dp"        android:scaleType="centerInside"        android:src="@drawable/im_search_gray"        android:background="#F0F0F0" />      <EditText        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="10dp"        android:layout_marginRight="15dp"        android:id="@+id/et_search_text"        android:layout_weight="1"        android:lines="1"        android:textSize="14sp"        android:background="@null"        android:hint="请输入搜索内容"/>      <ImageButton        android:layout_width="35dp"        android:layout_height="35dp"        android:padding="12.5dp"        android:id="@+id/imb_search_clear"        android:layout_marginRight="20dp"        android:src="@drawable/im_x"        android:visibility="gone"        android:scaleType="centerInside"        android:background="#F0F0F0" />    </LinearLayout></LinearLayout>

SearchView Java代码

package com.whieenz.searchselect;import android.content.Context;import android.text.Editable;import android.text.TextWatcher;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.widget.EditText;import android.widget.ImageView;import android.widget.LinearLayout;public class DialogSearchView extends LinearLayout implements View.OnClickListener {    private EditText etInput;    private ImageView ivDelete;    private Context mContext;    private DialogSearchViewListener mListener;    public void setDialogSearchViewListener(DialogSearchViewListener listener) {    mListener = listener;  }  public DialogSearchView(Context context, AttributeSet attrs) {    super(context, attrs);    mContext = context;    LayoutInflater.from(context).inflate(R.layout.view_search_layout, this);    initViews();  }  private void initViews() {    etInput = (EditText) findViewById(R.id.et_search_text);    ivDelete = (ImageView) findViewById(R.id.imb_search_clear);    ivDelete.setOnClickListener(this);    etInput.addTextChangedListener(new EditChangedListener());    etInput.setOnClickListener(this);  }  private class EditChangedListener implements TextWatcher {    @Override    public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {    }    @Override    public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {      if (!"".equals(charSequence.toString())) {        ivDelete.setVisibility(VISIBLE);        //更新autoComplete数据        if (mListener != null) {          mListener.onQueryTextChange(charSequence + "");        }      } else {        ivDelete.setVisibility(GONE);      }    }    @Override    public void afterTextChanged(Editable editable) {    }  }  @Override  public void onClick(View view) {    switch (view.getId()) {      case R.id.imb_search_clear:        etInput.setText("");        if (mListener != null) {          mListener.onQueryTextChange("");        }        ivDelete.setVisibility(GONE);        break;    }  }    public interface DialogSearchViewListener {    boolean onQueryTextChange(String text);  }}

自定义ListView Adapter

listItem 布局文件

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="50dp"  android:paddingLeft="10dp"  android:paddingTop="15dp"  android:paddingBottom="15dp"  android:orientation="horizontal">  <TextView    android:id="@+id/tv_select_info"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:textSize="20sp"    android:layout_centerInParent="true"    android:gravity="center"    android:lines="1"/></RelativeLayout>

Adapter 文件

package com.whieenz.searchselect;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;import java.util.List;public class SearchSelectAdapter extends BaseAdapter {  private List<String> Datas;  private Context context;  private LayoutInflater inflater;  public SearchSelectAdapter(Context ctx, List<String> datas){    this.context = ctx;    this.Datas = datas;    this.inflater = LayoutInflater.from(ctx);  }  @Override  public int getCount() {    return Datas.size();  }  @Override  public String getItem(int i) {    return Datas.get(i);  }  @Override  public long getItemId(int i) {    return i;  }  @Override  public View getView(int i, View view, ViewGroup viewGroup) {    ViewHolder holder = null;    if (view == null ) {      view = inflater.inflate(R.layout.list_cell_select_single, null);      holder = new ViewHolder(view);      view.setTag(holder);    } else {      holder = (ViewHolder) view.getTag();    }    holder.info.setText(Datas.get(i));    return view;  }  static class ViewHolder {    TextView info;    public ViewHolder(View view) {      info = view.findViewById(R.id.tv_select_info);    }  }}

MainActivity 实现

布局文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:id="@+id/activity_main"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="vertical"  android:padding="10dp"  tools:context="com.whieenz.searchselect.MainActivity">  <LinearLayout    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_marginTop="150dp"    android:orientation="horizontal">    <TextView      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:textSize="20sp"      android:gravity="left"      android:text="选择结果:"      />    <TextView      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:textSize="20sp"      android:textColor="#ff5c5c"      android:id="@+id/tv_result" />  </LinearLayout>  <Button    android:layout_width="match_parent"    android:layout_height="40dp"    android:layout_marginTop="20dp"    android:gravity="center"    android:textSize="20sp"    android:textColor="#ffffff"    android:background="@drawable/btn_bg"    android:text="打开选择器"    android:onClick="doSelect"/></LinearLayout>

Java文件

package com.whieenz.searchselect;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.TextView;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { private List<String> mDatas; private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  textView = (TextView) findViewById(R.id.tv_result);  initData(); } public void doSelect(View view){  SerachSelectDialog.Builder alert = new SerachSelectDialog.Builder(this);  alert.setListData(mDatas);  alert.setTitle("请选择城市");  alert.setSelectedListiner(new SerachSelectDialog.Builder.OnSelectedListiner() {   @Override   public void onSelected(String info) {    textView.setText(info);   }  });  SerachSelectDialog mDialog = alert.show();  //设置Dialog 尺寸  mDialog.setDialogWindowAttr(0.9,0.9,this); }  private void initData(){  mDatas = new ArrayList<>();  String [] citys = {"武汉","北京","上海","深圳","兰州","成都","天津"};  for (int i = 0; i < 10; i++) {   for (int j = 0; j < citys.length; j++) {    mDatas.add(citys[j]+i);   }  } }}

其他配置

Dialog style(样式)

  <style name="selectDialog" parent="@android:style/Theme.Dialog">    <item name="android:windowNoTitle">true</item>//无标题    <item name="android:windowBackground">@color/transparent</item>  </style>

上述内容就是Android中怎么自定义选择控件,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯