仅为TextView复合drawable实现onClick

我需要在左边有一些带有drawable的文本,我想在用户点击/触摸图像时执行一些代码(只有图像,而不是文本),所以我使用带有TextViewImageViewLinearLayout 。可点击并启动onClick事件。 XML解析器建议我用一个带有复合drawableTextView替换它,这将用更少的XML行绘制相同的东西。我的问题是“我可以指定我只想在on drawable上处理onClick事件TextView而不是TextView本身?我已经看到一些解决方案涉及编写自己的TextView扩展,但我只对能够在布局资源中做到这一点感兴趣,如果可能的话,我会保留以下内容XML代码:

    

Solutions Collecting From Web of "仅为TextView复合drawable实现onClick"

你可以去任何一个方向。 使用复合drawable更快,因为它旨在进行优化。 它使用较少的ram,因为你将3个视图减少为1,并且它的布局更快,因为你失去了1个深度。

如果我是你,我会考虑退后一步,看看文字和图像是否截获触摸来做任何动作都可能是一件好事。 通常,具有更大的触摸区域使得更容易按压。 有些用户实际上可能倾向于触摸文本而不是图像。

最后,如果你走合并2的路线,你可能要考虑使用Button而不是TextView 。 您可以设置按钮的样式,使其周围没有矩形。 他们称之为无边框按钮。 这很好,因为您获得了您在可操作项目上单击的视觉反馈,而ImageViewTextView通常无法操作。

如何在Android中创建无边框按钮

它非常简单。 假设你在TextView“txtview”的左侧有一个drawable。 以下将做到这一点。

 TextView txtview = (TextView) findViewById(R.id.txtview); txtview.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_UP) { if(event.getRawX() < = txtview.getTotalPaddingLeft()) { // your action for drawable click event return true; } } return true; } }); 

如果你想要正确的drawable改变if语句:

 if(event.getRawX() >= txtview.getRight() - txtview.getTotalPaddingRight()) 

同样,您可以为所有复合drawables执行此操作。

 txtview.getTotalPaddingTop(); txtview.getTotalPaddingBottom(); 

此方法调用返回该方的所有填充,包括任何drawable。 您甚至可以将它用于TextView,Button等。

点击这里从android开发者网站获取参考。

@ Vishnuvathsan的答案几乎是完美的,但getRaw()返回触摸点的绝对x位置。 如果textview不在视图的左边缘,则应使用getLocationOnScreen与textview的绝对位置进行比较。 下面的代码是检查左侧可绘式水龙头和右侧可水龙头的示例。

 textView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_UP) { int[] textLocation = new int[2]; textView.getLocationOnScreen(textLocation); if(event.getRawX() < = textLocation[0] + textView.getTotalPaddingLeft()) { //Left drawable was tapped. return true; }` if(event.getRawX() >= textLocation[0] + textView.getWidth() - textView.getTotalPaddingRight()){ //Right drawable was tapped. return true; } } return true; } });