1. Ajouter une vue de recherche personnalisée au fichier XML
<com.etoury.etoury.ui.view.IconCenterEditText android:id="@+id/search_et" style="@style/StyleEditText" android:hint="搜索景点信息" />
2. Fichier Java de vue personnalisé
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
</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
<?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. Ajouter du code à l'activité
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); } } });
Le contenu ci-dessus est le clavier logiciel Android personnalisé View mis en œuvre par l'éditeur pour vous présenter. J'espère qu'il vous plaira.
Pour plus d'articles sur la recherche d'implémentation de clavier logiciel Android personnalisés, veuillez faire attention au site Web PHP chinois !