IOS 스타일의 검색 상자
17713 단어 android 개발 기술 시리즈수색하다ios
이를 바탕으로 초점을 처리하였으며, 기본적으로 초점을 얻지 못하며, 클릭한 후에 초점을 얻고 소프트 키보드를 팝업합니다
/**
* IOS , , ,
*/
public class SearchEditText extends AppCompatEditText implements View.OnFocusChangeListener, View.OnKeyListener, TextWatcher, View.OnClickListener
{
private static final String TAG = "SearchEditText";
/**
*
*/
private boolean isIconLeft = false;
/**
*
*/
private boolean pressSearch = false;
/**
*
*/
private OnSearchClickListener listener;
private Drawable[] drawables; //
private Drawable drawableLeft, drawableDel; //
private int eventX, eventY; //
private Rect rect; //
private Context context;
public void setOnSearchClickListener(OnSearchClickListener listener)
{
this.listener = listener;
}
public interface OnSearchClickListener
{
void onSearchClick(View view);
void onTextChanged(String text);
void beforeTextChanged(String text);
void afterTextChanged(String text);
void viewClick();
}
public SearchEditText(Context context)
{
this(context, null);
this.context = context;
init();
}
public SearchEditText(Context context, AttributeSet attrs)
{
this(context, attrs, android.R.attr.editTextStyle);
this.context = context;
init();
}
public SearchEditText(Context context, AttributeSet attrs, int defStyleAttr)
{
super(context, attrs, defStyleAttr);
this.context = context;
init();
}
private void init()
{
//
setFocusable(false);
setOnFocusChangeListener(this);
setOnKeyListener(this);
addTextChangedListener(this);
setOnClickListener(this);
//
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
setCustomInsertionActionModeCallback(new ActionMode.Callback()
{
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu)
{
return false;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu)
{
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item)
{
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode)
{
}
});
}
setLongClickable(false);
/* SoftKeyBoardListener.setListener(context, new SoftKeyBoardListener.OnSoftKeyBoardChangeListener()
{
@Override
public void keyBoardShow(int height)
{
}
@Override
public void keyBoardHide(int height)
{ // , , , ,
setFocusable(false);
clearFocus();
}
});
*/
}
@Override
public void onClick(View v)
{
if (pressSearch)
{
return;
}
if (!isFocused())
{
// ,
setFocusableInTouchMode(true);
requestFocus();
isIconLeft = true;
invalidate();
setHint(" ");
}
setSelectAllOnFocus(false);
InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(this, 0);
/*InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);*/
if (listener != null)
{
listener.viewClick();
}
}
@Override
protected void onDraw(Canvas canvas)
{
if (isIconLeft)
{ // ,
if (length() < 1)
{
drawableDel = null;
}
this.setCompoundDrawablesWithIntrinsicBounds(drawableLeft, null, drawableDel, null);
super.onDraw(canvas);
}
else
{ // ,
if (drawables == null)
drawables = getCompoundDrawables();
if (drawableLeft == null)
drawableLeft = drawables[0];
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);
super.onDraw(canvas);
}
}
@Override
public void onFocusChange(View v, boolean hasFocus)
{
// ,
if (!pressSearch && TextUtils.isEmpty(getText().toString()))
{
isIconLeft = hasFocus;
}
}
// ,
public void setDefault()
{
setFocusable(false);
clearFocus();
setText("");
setHint(" ");
isIconLeft = false;
pressSearch = false;
invalidate();
}
@Override
public boolean onKey(View v, int keyCode, KeyEvent event)
{
pressSearch=false;
// && event.getAction() == KeyEvent.ACTION_DOWN
if (listener != null && event.getAction() == KeyEvent.ACTION_DOWN)
{
pressSearch = (keyCode == KeyEvent.KEYCODE_ENTER);
if (pressSearch)
{
/* */
InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isActive())
{
imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), 0);
}
listener.onSearchClick(v);
pressSearch = false;
setFocusable(false);
clearFocus();
}
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
// edit
if (drawableDel != null && event.getAction() == MotionEvent.ACTION_UP)
{
eventX = (int) event.getRawX();
eventY = (int) event.getRawY();
Log.i(TAG, "eventX = " + eventX + "; eventY = " + eventY);
if (rect == null)
rect = new Rect();
getGlobalVisibleRect(rect);
rect.left = rect.right - drawableDel.getIntrinsicWidth();
if (rect.contains(eventX, eventY))
{
// , , ,
setText("");
setFocusable(false);
/* */
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isActive())
{
imm.hideSoftInputFromWindow(this.getApplicationWindowToken(), 0);
}
// listener.onSearchClick(this);
}
}
//
if (drawableDel != null && event.getAction() == MotionEvent.ACTION_DOWN)
{
eventX = (int) event.getRawX();
eventY = (int) event.getRawY();
Log.i(TAG, "eventX = " + eventX + "; eventY = " + eventY);
if (rect == null)
rect = new Rect();
getGlobalVisibleRect(rect);
rect.left = rect.right - drawableDel.getIntrinsicWidth();
if (rect.contains(eventX, eventY))
drawableDel = this.getResources().getDrawable(R.drawable.delete_new);
}
else
{
drawableDel = this.getResources().getDrawable(R.drawable.delete_new);
}
return super.onTouchEvent(event);
}
@Override
public void afterTextChanged(Editable arg0)
{
if (this.length() < 1)
{
drawableDel = null;
}
else
{
drawableDel = this.getResources().getDrawable(R.drawable.delete_new);
}
if (listener != null)
{
listener.afterTextChanged(arg0 + "");
}
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3)
{
if (listener != null)
{
listener.beforeTextChanged(arg0 + "");
}
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3)
{
if (listener != null)
{
listener.onTextChanged(arg0 + "");
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
zoj 1002 Fire Net dfs이 문제를 다 풀고 나니, 나는 점점 돌아가는 것을 좋아하게 되었다.처음에는 이해가 안 됐는데, 지금은 역귀로 문제를 해결하는 것이 매우 편리하다고 느낀다. 하하! 처음에 이 문제는 잠시 후에 코드를 다 썼고 샘플도...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.