如何在编辑文本中添加可触摸的图像视图?

时间:2012-11-19 12:11:52

标签: java android android-layout android-widget

我需要在编辑文本中添加一个可触摸的图像视图,如ms word screen.How我们如何为此设计一个android布局屏幕?我已经尝试过如下代码:

public class edittext extends EditText 
{
     public String defaultValue = "";
        final Drawable imgX = getResources().getDrawable(android.R.drawable.presence_offline ); // X image

    private Html.ImageGetter imageGetter;
    public edittext(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        init();
        // TODO Auto-generated constructor stub
    }
    public edittext(Context context, AttributeSet attrs, int defStyle) 
    {
        super(context, attrs, defStyle);
        init();
        // TODO Auto-generated constructor stub
    }
    public edittext(Context context) 
    {
        super(context);
        init();
        // TODO Auto-generated constructor stub
    }
     void init()  {

            // Set bounds of our X button
            imgX.setBounds(0, 0, imgX.getIntrinsicWidth(), imgX.getIntrinsicHeight());      

            // There may be initial text in the field, so we may need to display the button
            manageClearButton();

           edittext.this.setOnTouchListener(new OnTouchListener() {
                public boolean onTouch(View v, MotionEvent event) {

                    edittext et = edittext.this;

                    // Is there an X showing?
                    if (et.getCompoundDrawables()[2] == null) return false;
                    // Only do this for up touches
                    if (event.getAction() != MotionEvent.ACTION_UP) return false;
                    // Is touch on our clear button?
                    if (event.getX() > et.getWidth() - et.getPaddingRight() - imgX.getIntrinsicWidth()) {
                        et.setText("");
                        edittext.this.removeClearButton();
                    }
                    return false;
                }
            });

            edittext.this.addTextChangedListener(new TextWatcher() {
                public void onTextChanged(CharSequence s, int start, int before, int count) {

                   edittext.this.manageClearButton();
                }

                public void afterTextChanged(Editable arg0) {
                }

                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
            });
        }

        void manageClearButton() {
            if (this.getText().toString().equals("") )
                removeClearButton();
            else
                addClearButton();
        }
        void addClearButton() {
            this.setCompoundDrawables(this.getCompoundDrawables()[0], 
                    this.getCompoundDrawables()[1],
                    imgX,
                    this.getCompoundDrawables()[3]);
        }
        void removeClearButton() {
            this.setCompoundDrawables(this.getCompoundDrawables()[0], 
                    this.getCompoundDrawables()[1],
                    null,
                    this.getCompoundDrawables()[3]);
        }   

}

如果有人知道,请帮助我谢谢。

4 个答案:

答案 0 :(得分:2)

我这样做。 Drawable将位于EditText的右侧。请尝试代码。

EditText contactLine = new EditText(getActivity());
Drawable drawable =  getActivity().getResources().getDrawable(...);
drawable.setBounds(new Rect(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()));
contactLine.setCompoundDrawables(null, null, drawable, null);
contactLine.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Drawable co =  v.getCompoundDrawables()[2];
            if (co == null) {
                return false;
            }
            if (event.getAction() != MotionEvent.ACTION_DOWN) {
                return false;
            }
            if (event.getX() > v.getMeasuredWidth() - v.getPaddingRight()
                    - co.getIntrinsicWidth()) {
                whatYouWantToDo();
                return true;
            } else {
                return false;
            }
        }
    });

答案 1 :(得分:2)

或者您只需使用ImageButton,例如:

public void addListenerOnImageButton() {
            imageButton.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    // called when imageButton Clicked
                }

            });}

答案 2 :(得分:0)

您可以使用RelativeLayout在布局中执行此操作。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <EditText
        android:id="@+id/et1"
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:clickable="false"
        android:focusable="false"
        android:background="@drawable/ic_action_search"/>
    <ImageView 
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/et1"
        android:paddingLeft="5dp"
        android:background="@drawable/ic_launcher"
        />

</RelativeLayout>

答案 3 :(得分:0)

对于RelativeLayout中的可移动视图,您可以执行此操作。 DragView可以是ImageView。

     View DragView;

     private boolean inDrag;
     int xDragTouchOffset, yDragTouchOffset;
     @Override
    public boolean onTouchEvent(View View, MotionEvent event) {
        final int action = event.getAction();
        final int x = (int) event.getX();
        final int y = (int) event.getY();
        boolean result = false;
        if (action == MotionEvent.ACTION_DOWN)
            inDrag = true;
            xDragTouchOffset = x;
            yDragTouchOffset = y;
            result = true;
        } else if (action == MotionEvent.ACTION_MOVE && inDrag == true) {
            setDragImagePosition(x, y);//HERE YOU HANDLE THE POSITION OF YOUR VIEW
            result = true;
        } else if (action == MotionEvent.ACTION_UP && inDrag ==true) {

            inDrag = false;
            result = true;
        }

        return result;

    }

    private void setDragImagePosition(int x, int y){

        RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) DragView
                .getLayoutParams();

        lp.setMargins(x - xDragImageOffset - xDragTouchOffset, y
                - yDragImageOffset - yDragTouchOffset, 0, 0);
        dragImage.setLayoutParams(lp);
     }