IOS 스타일의 검색 상자

UI는android와 IOS의 통일이 필요합니다. 검색 상자는 IOS 스타일입니다. 인터넷에서 [안드로이드 사용자 정의 컨트롤] 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 + "");
        }

    }
}

좋은 웹페이지 즐겨찾기