Android自定义View软键盘实现搜索

时间:2021-08-21 22:22:34

1. xml文件中加入自定义 搜索view

?
1
2
3
4
5
<com.etoury.etoury.ui.view.iconcenteredittext
      android:id="@+id/search_et"
      style="@style/styleedittext"
      android:hint="搜索景点信息"
      />

2. 自定义的   view java文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
iconcenteredittext.java
package com.etoury.etoury.ui.view;
import android.content.context;
import android.graphics.canvas;
import android.graphics.drawable.drawable;
import android.text.textutils;
import android.util.attributeset;
import android.util.log;
import android.view.keyevent;
import android.view.view;
import android.view.inputmethod.inputmethodmanager;
import android.widget.edittext;
public class iconcenteredittext extends edittext implements view.onfocuschangelistener, view.onkeylistener {
  private static final string tag = iconcenteredittext.class.getsimplename();
  /**
   * 是否是默认图标再左边的样式
   */
  private boolean isleft = false;
  /**
   * 是否点击软键盘搜索
   */
  private boolean presssearch = false;
  /**
   * 软键盘搜索键监听
   */
  private onsearchclicklistener listener;
  public void setonsearchclicklistener(onsearchclicklistener listener) {
    this.listener = listener;
  }
  public iconcenteredittext(context context) {
    this(context, null);
    init();
  }
  public iconcenteredittext(context context, attributeset attrs) {
    this(context, attrs, android.r.attr.edittextstyle);
    init();
  }
  public iconcenteredittext(context context, attributeset attrs, int defstyleattr) {
    super(context, attrs, defstyleattr);
    init();
  }
  private void init() {
    setonfocuschangelistener(this);
    setonkeylistener(this);
  }
  @override
  protected void ondraw(canvas canvas) {
    if (isleft) { // 如果是默认样式,则直接绘制
      super.ondraw(canvas);
    } else { // 如果不是默认样式,需要将图标绘制在中间
      drawable[] drawables = getcompounddrawables();
      drawable drawableleft = drawables[0];
      drawable drawableright = drawables[2];
      translate(drawableleft, canvas);
      translate(drawableright, canvas);
//      if (drawableleft != null) {
//        float textwidth = getpaint().measuretext(gethint().tostring());
//        int drawablepadding = getcompounddrawablepadding();
//        int drawablewidth = drawableleft.getintrinsicwidth();
//        float bodywidth = textwidth + drawablewidth + drawablepadding;
//
//        canvas.translate((getwidth() - bodywidth - getpaddingleft() - getpaddingright()) / 2, 0);
//      }
//      if (drawableright != null) {
//        float textwidth = getpaint().measuretext(gethint().tostring()); // 文字宽度
//        int drawablepadding = getcompounddrawablepadding(); // 图标间距
//        int drawablewidth = drawableright.getintrinsicwidth(); // 图标宽度
//        float bodywidth = textwidth + drawablewidth + drawablepadding;
//        setpadding(getpaddingleft(), getpaddingtop(), (int)(getwidth() - bodywidth - getpaddingleft()), getpaddingbottom());
//        canvas.translate((getwidth() - bodywidth - getpaddingleft()) / 2, 0);
//      }
      super.ondraw(canvas);
    }
  }
  public void translate(drawable drawable, canvas canvas) {
    if (drawable != null) {
      float textwidth = getpaint().measuretext(gethint().tostring());
      int drawablepadding = getcompounddrawablepadding();
      int drawablewidth = drawable.getintrinsicwidth();
      float bodywidth = textwidth + drawablewidth + drawablepadding;
      if (drawable == getcompounddrawables()[0]) {
        canvas.translate((getwidth() - bodywidth - getpaddingleft() - getpaddingright()) / 2, 0);
      } else {
        setpadding(getpaddingleft(), getpaddingtop(), (int)(getwidth() - bodywidth - getpaddingleft()), getpaddingbottom());
        canvas.translate((getwidth() - bodywidth - getpaddingleft()) / 2, 0);
      }
    }
  }
  @override
  public void onfocuschange(view v, boolean hasfocus) {
    log.d(tag, "onfocuschange execute");
    // 恢复edittext默认的样式
    if (!presssearch && textutils.isempty(gettext().tostring())) {
      isleft = hasfocus;
    }
  }
  @override
  public boolean onkey(view v, int keycode, keyevent event) {
    presssearch = (keycode == keyevent.keycode_enter);
    if (presssearch && listener != null) {
      /*隐藏软键盘*/
      inputmethodmanager imm = (inputmethodmanager) v.getcontext().getsystemservice(context.input_method_service);
      if (imm.isactive()) {
        imm.hidesoftinputfromwindow(v.getapplicationwindowtoken(), 0);
      }
      listener.onsearchclick(v);
    }
    return false;
  }
  public interface onsearchclicklistener {
    void onsearchclick(view view);
  }
}

 3. style

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</style> 
      <style name="styleedittext">
      <item name="android:layout_width">match_parent</item>
      <item name="android:layout_height">wrap_content</item>
      <item name="android:background">@drawable/bg_search_bar</item>
      <item name="android:drawablepadding">5dp</item>
      <item name="android:gravity">center_vertical</item>
      <item name="android:imeoptions">actionsearch</item>
      <item name="android:drawableleft">@drawable/icon_search</item>
      <item name="android:padding">5dp</item>
      <item name="android:singleline">true</item>
      <item name="android:textcolorhint">@color/grey</item>
      <item name="android:textsize">16sp</item>
      <item name="android:hint">搜索</item>
    </style>

 4. bg_search_bar.xml

?
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
  <solid android:color="@android:color/white" />
  <stroke
    android:width="1px"
    android:color="@android:color/darker_gray" />
  <corners android:radius="3dp" />
</shape>

 5. activity 中加上代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private iconcenteredittext search_et;
search_et = (iconcenteredittext) findviewbyid(r.id.search_et);
search_et.setonsearchclicklistener(new onsearchclicklistener() {
      @override
      public void onsearchclick(view view) {
        // todo auto-generated method stub
        string texts = search_et.gettext().tostring().trim();
        if ("".equals(texts)) {
          toastutil.showtoast("请输入您要搜索的内容");
        } else {
          //根据你的文字内容实现跳转          intent intent = new intent(context,
              searchwordactivity.class);
          // intent.putextra("searchmode", 1);
          intent.putextra("searchword", texts);
          context.startactivity(intent);
        }
      }
    });

以上内容是小编给大家介绍的android自定义view软键盘实现搜索,希望大家喜欢。