EditText的drawableRight上的Click事件无法正常工作?

时间:2015-11-30 10:17:26

标签: android android-edittext android-contacts android-drawable

我需要点击EditText的{​​{1}}打开手机的联系簿。 drawableRight上的点击事件工作正常但问题是,当我点击/触摸drawableRight上的任何位置时,它也会执行点击事件并打开联系人列表。

我从这里Please check this link.

获取EditText点击活动管理方面的帮助

点击drawableRight时,我不想打开联系人列表,我只想在点击EditText(图片)时打开它。那怎么解决这个问题呢?

drawbleRight

这是我的代码:

drawableRight

这是我的布局代码:

EditText mobile_number;
mobile_number = (EditText)view.findViewById(R.id.mobile_number1);
mobile_number.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                final int DRAWABLE_LEFT = 0;
                final int DRAWABLE_TOP = 1;
                final int DRAWABLE_RIGHT = 2;
                final int DRAWABLE_BOTTOM = 3;
                if(event.getAction()==MotionEvent.ACTION_UP){

                    if(event.getRawX()>=(mobile_number.getRight()-mobile_number.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width()));
                    {

                         Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
                        startActivityForResult(intent,PICK_CONTACT);

                        return true;
                    }
                }
                return true;
            }
        });

4 个答案:

答案 0 :(得分:4)

尝试用

替换该行,而不是使用getRawX()
if (event.getX() >= (mobile_number.getWidth() - mobile_number
        .getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {

编辑:我相信View.getRight()返回View右边缘相对于其父级的位置,而TouchEvent.getRawX()返回屏幕上的绝对X位置。

再次编辑以表明我的观点:

MainActivity.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.meremammal.www.edittextdrawable.MainActivity">

    <!-- This layout is only here to demonstrate a situation that breaks the usage of getRawX() -->
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true">

        <EditText
            android:id="@+id/edit_text"
            android:layout_width="400dp"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            android:drawableRight="@android:drawable/ic_input_add"/>

    </RelativeLayout>

</RelativeLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    EditText mEditText;
    Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mContext = this;
        mEditText = (EditText) findViewById(R.id.edit_text);
        mEditText.setOnTouchListener(new View.OnTouchListener() {

            private float touchX = 0;
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                int drawableLeft = mEditText.getRight() - mEditText
                        .getCompoundDrawables()[2].getBounds().width();
                // This detects the location of touch on ACTION_DOWN, but because it is
                // using getRawX() and getRight() and the EditText's parent is not at the
                // left of the screen, it will respond when clicked in the middle of the
                // EditText. Instead, use getX() and EditText.getWidth()
                if (event.getAction() == MotionEvent.ACTION_DOWN && event.getRawX() >= drawableLeft) {
                    touchX = event.getRawX();
                    return true;
                } else if (event.getAction() == MotionEvent.ACTION_UP && touchX >= drawableLeft) {
                    Toast.makeText(mContext, "Clicked Button",     Toast.LENGTH_SHORT).show();
                    touchX = 0;
                    return true;
                } else {
                    return mEditText.onTouchEvent(event);
                }
            }
        });
    }
}

答案 1 :(得分:0)

除非您创建自定义的EditText类,否则您无法访问我所知的正确图像。我建议使用RelativeLayout,使用一个editText和一个imageView,并在图像视图上设置OnClickListener,如下所示:

<RelativeLayout
        android:id="@+id/rlSearch"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:drawable/edit_text"
        android:padding="5dip" >

        <EditText
            android:id="@+id/txtSearch"
            android:layout_width="match_parent"

            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toLeftOf="@+id/imgSearch"
            android:background="#00000000"
            android:ems="10"/>

        <ImageView
            android:id="@+id/imgSearch"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:src="@drawable/btnsearch" />
    </RelativeLayout>

答案 2 :(得分:0)

制作水平方向的线性布局,并添加具有适当重量的编辑文本和图像视图。

然后单独点击每个项目......

答案 3 :(得分:0)

将最后return归为false。此外,您必须删除if语句末尾的逗号;