自定义控件——快速搜索匹配
来源:互联网 发布:strtoupper php 编辑:程序博客网 时间:2024/06/12 21:56
PopupWindow是Android中的一个弹窗,相比dialog他更加灵活,优雅,可以再任何位置显示,在开发中经常使用,尤其是在和TextView或者EditText结合使用中更加常见,最近项目做了一个自定义控件,快速搜索栏的匹配,过程中遇到这样的一个问题,当点击输入框时候会自动弹起输入法的软键盘,输入一次文字后EditText的光标就暂停闪动,一直显示在文字后面,无法输入新的内容,无法删除现有的输入内容,必须手动点击的输入框使输入法再次弹起才能输入,但是也只能输入一次,删除也只能删除一个字,光标一直显示在文字后面停止闪动,必须手动触摸才能唤起闪动,重新输入或者删除,每次输入删除只能输入一次。最后经过多次查找才解决了这个bug。最终效果如下:
一、PopupWindow的使用
1、创建View对象,用于PopupWindow内容的显示,这里显示的是listview。
ListView listView = new ListView(this);
2、创建PopupWindow对象
PopupWindow popupWindow = new PopupWindow(listView, AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.MATCH_PARENT, true);
参数1:所要设置的布局,参数2:显示布局的宽,参数3:显示布局的高,参数4:PopupWindow是否获得焦点的能力。
3、showAsDropDown(View anchor, int xoff, int yoff);
参数1:相对于此控件 参数2:相对于此控件款宽 参数3:相对于此控件高,默认显示在此控件的正下方。
//相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
showAtLocation(View parent, int gravity, int x, int y);
4、其他设置
PopupWindow弹出来时候默认是无法取消的额,要点击外区域取消,需要设置背景颜色,
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
如果有背景,则会在contentView外面包一层PopupViewContainer之后作为mPopupView,如果没有背景,则直接用contentView作为mPopupView。 而这个PopupViewContainer是一个内部私有类,它继承了FrameLayout,在其中重写了Key和Touch事件的分发处理。 设置视图可点击响应事件,如listview可以响应点击事件具有
popupWindow.setFocusable(true);
//设置为true
PopupWindow弹出后,所有的触屏和物理按键都有PopupWindows处理。其他任何事件的响应都必须发生在PopupWindow消失之后。返回键除外。
//设置为false
则PopUpWindow只是一个浮现在当前界面上的view而已,不影响当前界面的任何操作。
二、快速搜索栏的实现
现在实现快速搜索栏,当edittext的获取到输入信息时候,PopupWindow立即弹窗显示包含搜索字段的列表,显示在
listview上面 ,点击item,携带数据到相应的位置。
核心代码如下:
1、对EditText进行监听
private TextWatcher watcher = new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { //在此进行方法调用,获取edittext的值 String newEtText = etSearch.getText().toString().trim(); } };注册监听:edittext.addTextChangedListener(watcher);
2、进行字段匹配
//创建集合,存储PopupWindow要显示的内容 ArrayList<String> popwinList = new ArrayList<>(); if (list != null) { //list为所有可能被匹配到的字符串集合 for (int i = 0; i < list.size(); i++) { if (name.contains(newEtText)) { popwinList.add(name); } } popwinShow(); }3、对PopupWindow
private void popwinShow() { ListView listView = new ListView(this); listView.setAdapter(new MyAdapter(popwinList)); PopupWindow popupWindow = new PopupWindow(listView, AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.MATCH_PARENT, true); popupWindow.setBackgroundDrawable(new ColorDrawable(Color.WHITE)); popupWindow.setFocusable(false); popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); popupWindow.showAsDropDown(etSearch, ScreenUtils.dp2Px(18, this), ScreenUtils.dp2Px(18, this)); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { } }); }popupWindow.setFocusable(false);
popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
这两个是核心内容:
(1)设置 popupWindow.setFocusable(false); 设置popupWindow无焦点,设置为true,会导致edittext无法正常输入删除,和文章开始描述的一样,设置为false会导致popupWindow被遮盖。
(2)popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);解决软键盘被遮挡的问题,在清单文件中设置android:windowSoftInputMode="adjustResize"可能无效。这时候需要在代码设置。
- 自定义控件——快速搜索匹配
- Android 自定义支持快速搜索筛选的选择控件
- 自定义搜索控件
- WPF自定义搜索控件
- 搜索历史 AutoCompleteTextView自定义匹配关键字匹配
- 自定义控件--快速检索
- 自定义控件:快速索引
- Android自定义View——自定义搜索框(SearchView) 非常实用的控件
- 字母列表快速搜索控件
- 安卓自定义搜索控件
- 自定义控件——初识自定义控件
- JS——下拉搜索列表(模糊搜索匹配)
- 自定义控件--快速索引(一)
- 自定义控件--快速索引(二)
- 自定义控件--快速索引(三)
- Android学习笔记05: Android快速自定义控件+实战演示——新手进阶必看!
- Android-AutoComplete控件与MultiAutoComplete控件搜索匹配
- iOS开发系列之常用自定义控件开发集—继承UIButton控件代码快速创建按钮开发
- 杭电 2036 改革春风吹满地
- java再复习-Semaphere的使用
- L1-014. 简单题
- Android补间动画之旋转动画
- kafka-topics.sh的delete命令删除topic
- 自定义控件——快速搜索匹配
- 书架Bookshelf
- 数据结构与算法之循环链表 <三>
- 脉冲神经网络的五脏六腑
- 关于测试的起始 : 测试系统工程师TSE的职责与培养
- 20170311-leetcode-Fractial Trailing Zeroes
- CSS3中字体平滑处理和抗锯齿渲染
- 非常芬兰
- Gyroscope in smartphone 手机中的陀螺仪传感器