একটি সম্পাদনা পাঠ্যের মধ্যে একটি আঁকতে ক্লিক ইভেন্টগুলি হ্যান্ডলিং


238

আমি EditTextনীচের এক্সএমএলটি ব্যবহার করে একটি উইজেটে টেক্সটের ডানদিকে যুক্ত করেছি :

<EditText
  android:id="@+id/txtsearch"
  ...
  android:layout_gravity="center_vertical"
  android:background="@layout/shape"
  android:hint="Enter place,city,state"
  android:drawableRight="@drawable/cross" />

তবে আমি EditTextযখন এমবেড করা চিত্রটি ক্লিক করা হয় তখন সাফ করতে চাই । কিভাবে আমি এটি করতে পারব?


সম্ভাব্য সদৃশ stackoverflow.com/questions/13135447/...
Hardik4560

উত্তর:


358

আসলে আপনার কোনও ক্লাস বাড়ানোর দরকার নেই। ধরা যাক আমার কাছে একটি অঙ্কনযোগ্য রাইট সহ একটি সম্পাদনা পাঠ্য সম্পাদনা আছে Com

editComment.setOnTouchListener(new 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() >= (editComment.getRight() - editComment.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {
                // your action here

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

আমরা getRawX()পিতামাতার তুলনায় নয়, আমরা স্ক্রিনে টাচের আসল অবস্থান পেতে চাই।

বাম দিকে ক্লিক করতে

if(event.getRawX() <= (editComment.getCompoundDrawables()[DRAWABLE_LEFT].getBounds().width())) 

2
@ user2848783 কীভাবে এটি আমার বাম অঙ্কনযোগ্যতে সেট করবেন?
কাদির হুসেন

10
@ অ্যাঞ্জেলোসের event.getRawX()পরিবর্তে পরিবর্তিত হয়ে কাজ করাevent.getX()
প্রতীক

4
একটি নোট: প্রতিস্থাপন "মিথ্যা প্রত্যাবর্তন;" "সত্য প্রত্যাবর্তন;" অন্যথায় ACTION_DOWN -> ACTION_UP এর পরে বরখাস্ত করা হবে না।
tomurka

9
আপনি যদি প্যাডিং যুক্ত করেন তবে আপনাকে এটি গণনা করতে হবে যে পাশাপাশি getRight()টেক্সটভিউয়ের ডানদিক পাওয়া যায়, যা প্যাডিং থাকলে আঁকার যোগ্য নয়। - editComment.getPaddingRight()আপনার ifবিবৃতি শেষে যুক্ত করা কাজ করা উচিত।
কাসিম

21
এডিটেক্সট এর পিতামাতার পর্দার বাম সাথে একত্রিত না করা থাকলে এটি কাজ করে না। আপনার ইভেন্ট.বেটআরএক্সএক্সের পরিবর্তে ইভেন্ট.গেটএক্স () ব্যবহার করা উচিত এবং এডিট টেক্সট.জেট রাইট () এর পরিবর্তে editText.getWidth () ব্যবহার করতে হবে
ফ্ল্যাচার জন

85

খুব, খুব ভাল, যারা এই আলোচনায় অবদান রেখেছেন তাদের সবাইকে ধন্যবাদ। সুতরাং আপনি যদি শ্রেণিটি বাড়ানোর অসুবিধার সাথে মোকাবিলা করতে না চান তবে আপনি নিম্নলিখিতটি করতে পারেন (কেবলমাত্র সঠিক অঙ্কনীয় জন্য কার্যকর)

this.keyword = (AutoCompleteTextView) findViewById(R.id.search);
this.keyword.setOnTouchListener(new RightDrawableOnTouchListener(keyword) {
        @Override
        public boolean onDrawableTouch(final MotionEvent event) {
            return onClickSearch(keyword,event);
        }
    });

private boolean onClickSearch(final View view, MotionEvent event) {
    // do something
    event.setAction(MotionEvent.ACTION_CANCEL);
    return false;
}

এবং এখানে @ মার্কের উত্তরের ভিত্তিতে খালি-হাড়ের শ্রোতা বাস্তবায়ন

public abstract class RightDrawableOnTouchListener implements OnTouchListener {
    Drawable drawable;
    private int fuzz = 10;

    /**
     * @param keyword
     */
    public RightDrawableOnTouchListener(TextView view) {
        super();
        final Drawable[] drawables = view.getCompoundDrawables();
        if (drawables != null && drawables.length == 4)
            this.drawable = drawables[2];
    }

    /*
     * (non-Javadoc)
     * 
     * @see android.view.View.OnTouchListener#onTouch(android.view.View, android.view.MotionEvent)
     */
    @Override
    public boolean onTouch(final View v, final MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN && drawable != null) {
            final int x = (int) event.getX();
            final int y = (int) event.getY();
            final Rect bounds = drawable.getBounds();
            if (x >= (v.getRight() - bounds.width() - fuzz) && x <= (v.getRight() - v.getPaddingRight() + fuzz)
                    && y >= (v.getPaddingTop() - fuzz) && y <= (v.getHeight() - v.getPaddingBottom()) + fuzz) {
                return onDrawableTouch(event);
            }
        }
        return false;
    }

    public abstract boolean onDrawableTouch(final MotionEvent event);

}

3
সঠিক অবস্থানটি পেতে আপনার v.getLeft () x এবং v.getTop () যুক্ত করতে হবে y
আন্দ্রে

3
আসলে আপনার v.getRight()দ্বারা প্রতিস্থাপন করা উচিত v.getWidth()
দ্রুত

2
নোট করুন যে আপনার ফাজ ফ্যাক্টরটি ডিপিআই দিয়ে স্কেল করা উচিত, এলডিপিতে 10px xxhdpi এর 10px থেকে সম্পূর্ণ আলাদা is
রবি

4
ফাজ কিসের জন্য? পরিষ্কার করে বলো.
Мазуревич

1
দেখে মনে হচ্ছে fuzzকার্যকরভাবে টেপযোগ্য অঞ্চলটিকে কিছুটা বড় করা হয়েছে, এটি ছোট অঙ্কনযোগ্যকে ট্যাপ করা সহজ করে তোলে।
নিষিদ্ধ-জিওঞ্জিনিয়ারিং

28

নিম্নোক্ত বিবেচনা কর. এটি সবচেয়ে মার্জিত সমাধান নয় তবে এটি কাজ করে, আমি কেবল এটি পরীক্ষা করেছি।

  1. একটি কাস্টমাইজড EditTextক্লাস তৈরি করুন CustomEditText.java:

    import android.content.Context;
    import android.graphics.Rect;
    import android.graphics.drawable.Drawable;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.widget.EditText;
    
    public class CustomEditText extends EditText
    {
      private Drawable dRight;
      private Rect rBounds;
    
      public CustomEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
      }
      public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
      }
      public CustomEditText(Context context) {
        super(context);
      }
    
      @Override
      public void setCompoundDrawables(Drawable left, Drawable top,
          Drawable right, Drawable bottom)
      {
        if(right !=null)
        {
          dRight = right;
        }
        super.setCompoundDrawables(left, top, right, bottom);
      }
    
      @Override
      public boolean onTouchEvent(MotionEvent event)
      {
    
        if(event.getAction() == MotionEvent.ACTION_UP && dRight!=null)
        {
          rBounds = dRight.getBounds();
          final int x = (int)event.getX();
          final int y = (int)event.getY();
          //System.out.println("x:/y: "+x+"/"+y);
          //System.out.println("bounds: "+bounds.left+"/"+bounds.right+"/"+bounds.top+"/"+bounds.bottom);
          //check to make sure the touch event was within the bounds of the drawable
          if(x>=(this.getRight()-rBounds.width()) && x<=(this.getRight()-this.getPaddingRight())
              && y>=this.getPaddingTop() && y<=(this.getHeight()-this.getPaddingBottom()))
          {
            //System.out.println("touch");
            this.setText("");
            event.setAction(MotionEvent.ACTION_CANCEL);//use this to prevent the keyboard from coming up
          }
        }
        return super.onTouchEvent(event);
      }
    
      @Override
      protected void finalize() throws Throwable
      {
        dRight = null;
        rBounds = null;
        super.finalize();
      }
    }
  2. এতে আপনার লেআউট এক্সএমএল পরিবর্তন করুন ( com.exampleআপনার আসল প্রকল্পের প্যাকেজের নামটি কোথায় ):

    <com.example.CustomEditText
        android:id="@+id/txtsearch"android:layout_gravity="center_vertical"
        android:background="@layout/shape"
        android:hint="Enter place,city,state"
        android:drawableRight="@drawable/cross" 
    />
  3. শেষ অবধি, আপনার ক্রিয়াকলাপে এটি (বা এর মতো কিছু) যুক্ত করুন:

    
    CustomEditText et = (CustomEditText) this.findViewById(R.id.txtsearch);
    

নেস্টেড ড্রইবেলেটের জন্য স্পর্শের সীমার গণনা নিয়ে আমি কিছুটা দূরে থাকতে পারি তবে আপনি ধারণাটি পেয়ে যান।

আশা করি এটা কাজে লাগবে.


আসলে, শুনলাম MotionEvent পরিবর্তন নিরুৎসাহিত অনুশীলন যে, অনির্ধারিত আচরণ সম্ভবত বিভিন্ন প্ল্যাটফর্মের উপর বিরতি দেবে নেতৃস্থানীয়, তাই সম্ভবত একটি ভাল সমাধান হতে পারে stackoverflow.com/a/6235602
Giulio Piancastelli

@ রায়ানম, আমি এর TextViewপরিবর্তে ব্যবহার করেছি EditText। আমি কোডটি নিয়েছি এবং যদি আমি TextView(আইকনটিতে নয় তবে কোনও জায়গাতে TextView) ক্লিক করি তবে পদ্ধতিটি onTouchEvent(MotionEvent event)বলা হয়। সুতরাং, আমি কোনও অতিরিক্ত ক্লাস ছাড়াই OnClickListenerস্বাভাবিকের জন্য বাস্তবায়ন করতে পারিTextViewCustomEditText
মাকসিম দিমিত্রিভ

@ আরয়ানএম, ব্যবহারের পরিবর্তে ব্যবহার করবেন this.getRight()-rBounds.width()না কেন this.getMeasuredWidth() - this.getCompoundPaddingRight()? এটি কি অঙ্কনযোগ্য প্যাডিং যত্ন নেবে এবং অঙ্কনযোগ্য এর আবদ্ধ থেকে মুক্তি পাবে না?
ভিনো

@ রায়ানম কীভাবে ক্রস বাটন ক্লিক ইভেন্টের স্পর্শে চিত্রটি পরিবর্তন করবেন?
কাদির হুসেন

EditTextপ্রি-ললিপপ ডিভাইসে অ্যাপকোম্প্যাট ব্যবহার করার সময় কাস্টম সংস্করণগুলি সঠিক উইজেটগুলি টিন্টিং সমর্থন করে না। AppCompatEditTextআপনার কাস্টম সম্পাদনা
পাঠের

24

আমি একটি দরকারী অ্যাবস্ট্রাক্ট ক্লাস তৈরি করেছি ড্রয়যোগ্যক্লিকলিস্টনার যা অনটচলিস্টাইনার প্রয়োগ করে

DrawableClickListener বর্গ ছাড়াও , আমি 4 টি অতিরিক্ত বিমূর্ত ক্লাসও তৈরি করেছি যা DrawableClickListener শ্রেণি প্রসারিত করে এবং সঠিক কোয়াড্রেন্টের জন্য অঙ্কনযোগ্য অঞ্চলটির ক্লিক পরিচালনা করে।

  • LeftDrawableClickListener
  • TopDrawableClickListener
  • RightDrawableClickListener
  • BottomDrawableClickListener

বিবেচনা করুন পয়েন্ট

একটি বিষয় বিবেচনা করতে হবে যে এইভাবে করা হলে চিত্রগুলি পুনরায় আকার দেওয়া হয় না; সুতরাং চিত্রগুলি পুনরায় / অঙ্কনযোগ্য ফোল্ডারে রাখার আগে অবশ্যই সঠিকভাবে স্কেল করা উচিত ।

আপনি যদি একটি সংজ্ঞায়িত তাহলে LinearLayout একটি ধারণকারী ImageView এবং TextView , এটা ইমেজ আকার প্রদর্শিত হচ্ছে নিপূণভাবে অনেক সহজ।


activity_my.xml

<?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="match_parent" >

    <TextView
        android:id="@+id/myTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="replace this with a variable"
        android:textSize="30sp"
        android:drawableLeft="@drawable/my_left_image"
        android:drawableRight="@drawable/my_right_image"
        android:drawablePadding="9dp" />

</RelativeLayout>

MyActivity.java

package com.company.project.core;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MyActivity extends Activity
{

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

        final TextView myTextView = (TextView) this.findViewById( R.id.myTextView );
        myTextView.setOnTouchListener( new DrawableClickListener.LeftDrawableClickListener(myTextView)
        {
            @Override
            public boolean onDrawableClick()
            {
                // TODO : insert code to perform on clicking of the LEFT drawable image...

                return true;
            }
        } );
        myTextView.setOnTouchListener( new DrawableClickListener.RightDrawableClickListener(myTextView)
        {
            @Override
            public boolean onDrawableClick()
            {
                // TODO : insert code to perform on clicking of the RIGHT drawable image...

                return true;
            }
        } );
    }

}

DrawableClickListener.java

package com.company.project.core;

import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.TextView;

/**
 * This class can be used to define a listener for a compound drawable.
 * 
 * @author Matthew Weiler
 * */
public abstract class DrawableClickListener implements OnTouchListener
{

    /* PUBLIC CONSTANTS */
    /**
     * This represents the left drawable.
     * */
    public static final int DRAWABLE_INDEX_LEFT = 0;
    /**
     * This represents the top drawable.
     * */
    public static final int DRAWABLE_INDEX_TOP = 1;
    /**
     * This represents the right drawable.
     * */
    public static final int DRAWABLE_INDEX_RIGHT = 2;
    /**
     * This represents the bottom drawable.
     * */
    public static final int DRAWABLE_INDEX_BOTTOM = 3;
    /**
     * This stores the default value to be used for the
     * {@link DrawableClickListener#fuzz}.
     * */
    public static final int DEFAULT_FUZZ = 10;

    /* PRIVATE VARIABLES */
    /**
     * This stores the number of pixels of &quot;fuzz&quot; that should be
     * included to account for the size of a finger.
     * */
    private final int fuzz;
    /**
     * This will store a reference to the {@link Drawable}.
     * */
    private Drawable drawable = null;

    /* CONSTRUCTORS */
    /**
     * This will create a new instance of a {@link DrawableClickListener}
     * object.
     * 
     * @param view
     *            The {@link TextView} that this {@link DrawableClickListener}
     *            is associated with.
     * @param drawableIndex
     *            The index of the drawable that this
     *            {@link DrawableClickListener} pertains to.
     *            <br />
     *            <i>use one of the values:
     *            <b>DrawableOnTouchListener.DRAWABLE_INDEX_*</b></i>
     */
    public DrawableClickListener( final TextView view, final int drawableIndex )
    {
        this( view, drawableIndex, DrawableClickListener.DEFAULT_FUZZ );
    }

    /**
     * This will create a new instance of a {@link DrawableClickListener}
     * object.
     * 
     * @param view
     *            The {@link TextView} that this {@link DrawableClickListener}
     *            is associated with.
     * @param drawableIndex
     *            The index of the drawable that this
     *            {@link DrawableClickListener} pertains to.
     *            <br />
     *            <i>use one of the values:
     *            <b>DrawableOnTouchListener.DRAWABLE_INDEX_*</b></i>
     * @param fuzzOverride
     *            The number of pixels of &quot;fuzz&quot; that should be
     *            included to account for the size of a finger.
     */
    public DrawableClickListener( final TextView view, final int drawableIndex, final int fuzz )
    {
        super();
        this.fuzz = fuzz;
        final Drawable[] drawables = view.getCompoundDrawables();
        if ( drawables != null && drawables.length == 4 )
        {
            this.drawable = drawables[drawableIndex];
        }
    }

    /* OVERRIDDEN PUBLIC METHODS */
    @Override
    public boolean onTouch( final View v, final MotionEvent event )
    {
        if ( event.getAction() == MotionEvent.ACTION_DOWN && drawable != null )
        {
            final int x = (int) event.getX();
            final int y = (int) event.getY();
            final Rect bounds = drawable.getBounds();
            if ( this.isClickOnDrawable( x, y, v, bounds, this.fuzz ) )
            {
                return this.onDrawableClick();
            }
        }
        return false;
    }

    /* PUBLIC METHODS */
    /**
     * 
     * */
    public abstract boolean isClickOnDrawable( final int x, final int y, final View view, final Rect drawableBounds, final int fuzz );

    /**
     * This method will be fired when the drawable is touched/clicked.
     * 
     * @return
     *         <code>true</code> if the listener has consumed the event;
     *         <code>false</code> otherwise.
     * */
    public abstract boolean onDrawableClick();

    /* PUBLIC CLASSES */
    /**
     * This class can be used to define a listener for a <b>LEFT</b> compound
     * drawable.
     * */
    public static abstract class LeftDrawableClickListener extends DrawableClickListener
    {

        /* CONSTRUCTORS */
        /**
         * This will create a new instance of a
         * {@link LeftDrawableClickListener} object.
         * 
         * @param view
         *            The {@link TextView} that this
         *            {@link LeftDrawableClickListener} is associated with.
         */
        public LeftDrawableClickListener( final TextView view )
        {
            super( view, DrawableClickListener.DRAWABLE_INDEX_LEFT );
        }

        /**
         * This will create a new instance of a
         * {@link LeftDrawableClickListener} object.
         * 
         * @param view
         *            The {@link TextView} that this
         *            {@link LeftDrawableClickListener} is associated with.
         * @param fuzzOverride
         *            The number of pixels of &quot;fuzz&quot; that should be
         *            included to account for the size of a finger.
         */
        public LeftDrawableClickListener( final TextView view, final int fuzz )
        {
            super( view, DrawableClickListener.DRAWABLE_INDEX_LEFT, fuzz );
        }

        /* PUBLIC METHODS */
        public boolean isClickOnDrawable( final int x, final int y, final View view, final Rect drawableBounds, final int fuzz )
        {
            if ( x >= ( view.getPaddingLeft() - fuzz ) )
            {
                if ( x <= ( view.getPaddingLeft() + drawableBounds.width() + fuzz ) )
                {
                    if ( y >= ( view.getPaddingTop() - fuzz ) )
                    {
                        if ( y <= ( view.getHeight() - view.getPaddingBottom() + fuzz ) )
                        {
                            return true;
                        }
                    }
                }
            }
            return false;
        }

    }

    /**
     * This class can be used to define a listener for a <b>TOP</b> compound
     * drawable.
     * */
    public static abstract class TopDrawableClickListener extends DrawableClickListener
    {

        /* CONSTRUCTORS */
        /**
         * This will create a new instance of a {@link TopDrawableClickListener}
         * object.
         * 
         * @param view
         *            The {@link TextView} that this
         *            {@link TopDrawableClickListener} is associated with.
         */
        public TopDrawableClickListener( final TextView view )
        {
            super( view, DrawableClickListener.DRAWABLE_INDEX_TOP );
        }

        /**
         * This will create a new instance of a {@link TopDrawableClickListener}
         * object.
         * 
         * @param view
         *            The {@link TextView} that this
         *            {@link TopDrawableClickListener} is associated with.
         * @param fuzzOverride
         *            The number of pixels of &quot;fuzz&quot; that should be
         *            included to account for the size of a finger.
         */
        public TopDrawableClickListener( final TextView view, final int fuzz )
        {
            super( view, DrawableClickListener.DRAWABLE_INDEX_TOP, fuzz );
        }

        /* PUBLIC METHODS */
        public boolean isClickOnDrawable( final int x, final int y, final View view, final Rect drawableBounds, final int fuzz )
        {
            if ( x >= ( view.getPaddingLeft() - fuzz ) )
            {
                if ( x <= ( view.getWidth() - view.getPaddingRight() + fuzz ) )
                {
                    if ( y >= ( view.getPaddingTop() - fuzz ) )
                    {
                        if ( y <= ( view.getPaddingTop() + drawableBounds.height() + fuzz ) )
                        {
                            return true;
                        }
                    }
                }
            }
            return false;
        }

    }

    /**
     * This class can be used to define a listener for a <b>RIGHT</b> compound
     * drawable.
     * */
    public static abstract class RightDrawableClickListener extends DrawableClickListener
    {

        /* CONSTRUCTORS */
        /**
         * This will create a new instance of a
         * {@link RightDrawableClickListener} object.
         * 
         * @param view
         *            The {@link TextView} that this
         *            {@link RightDrawableClickListener} is associated with.
         */
        public RightDrawableClickListener( final TextView view )
        {
            super( view, DrawableClickListener.DRAWABLE_INDEX_RIGHT );
        }

        /**
         * This will create a new instance of a
         * {@link RightDrawableClickListener} object.
         * 
         * @param view
         *            The {@link TextView} that this
         *            {@link RightDrawableClickListener} is associated with.
         * @param fuzzOverride
         *            The number of pixels of &quot;fuzz&quot; that should be
         *            included to account for the size of a finger.
         */
        public RightDrawableClickListener( final TextView view, final int fuzz )
        {
            super( view, DrawableClickListener.DRAWABLE_INDEX_RIGHT, fuzz );
        }

        /* PUBLIC METHODS */
        public boolean isClickOnDrawable( final int x, final int y, final View view, final Rect drawableBounds, final int fuzz )
        {
            if ( x >= ( view.getWidth() - view.getPaddingRight() - drawableBounds.width() - fuzz ) )
            {
                if ( x <= ( view.getWidth() - view.getPaddingRight() + fuzz ) )
                {
                    if ( y >= ( view.getPaddingTop() - fuzz ) )
                    {
                        if ( y <= ( view.getHeight() - view.getPaddingBottom() + fuzz ) )
                        {
                            return true;
                        }
                    }
                }
            }
            return false;
        }

    }

    /**
     * This class can be used to define a listener for a <b>BOTTOM</b> compound
     * drawable.
     * */
    public static abstract class BottomDrawableClickListener extends DrawableClickListener
    {

        /* CONSTRUCTORS */
        /**
         * This will create a new instance of a
         * {@link BottomDrawableClickListener} object.
         * 
         * @param view
         *            The {@link TextView} that this
         *            {@link BottomDrawableClickListener} is associated with.
         */
        public BottomDrawableClickListener( final TextView view )
        {
            super( view, DrawableClickListener.DRAWABLE_INDEX_BOTTOM );
        }

        /**
         * This will create a new instance of a
         * {@link BottomDrawableClickListener} object.
         * 
         * @param view
         *            The {@link TextView} that this
         *            {@link BottomDrawableClickListener} is associated with.
         * @param fuzzOverride
         *            The number of pixels of &quot;fuzz&quot; that should be
         *            included to account for the size of a finger.
         */
        public BottomDrawableClickListener( final TextView view, final int fuzz )
        {
            super( view, DrawableClickListener.DRAWABLE_INDEX_BOTTOM, fuzz );
        }

        /* PUBLIC METHODS */
        public boolean isClickOnDrawable( final int x, final int y, final View view, final Rect drawableBounds, final int fuzz )
        {
            if ( x >= ( view.getPaddingLeft() - fuzz ) )
            {
                if ( x <= ( view.getWidth() - view.getPaddingRight() + fuzz ) )
                {
                    if ( y >= ( view.getHeight() - view.getPaddingBottom() - drawableBounds.height() - fuzz ) )
                    {
                        if ( y <= ( view.getHeight() - view.getPaddingBottom() + fuzz ) )
                        {
                            return true;
                        }
                    }
                }
            }
            return false;
        }

    }

}

14

এটা খুবই সাধারণ. আমাদের সম্পাদনা পাঠ্য 'txtsearch' এর বাম দিকে আপনার কাছে একটি অঙ্কনযোগ্য রয়েছে তা বলুন। নিম্নলিখিতটি কৌশলটি করবে।

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

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

আপনি যদি সঠিক চিত্রের জন্য চান তবে এই বিবৃতিটি এতে পরিবর্তন করুন:

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

একইভাবে, আপনি সমস্ত যৌগিক ড্রএবলের জন্য এটি করতে পারেন।

txtsearch.getTotalPaddingTop()
txtsearch.getTotalPaddingBottom()

এই পদ্ধতি কলটি যে কোনও অঙ্কনযোগ্য সহ সেটির সমস্ত প্যাডিং দেয়। আপনি এটি টেক্সটভিউ, বাটন ইত্যাদির জন্যও ব্যবহার করতে পারেন

অ্যান্ড্রয়েড বিকাশকারী সাইট থেকে রেফারেন্সের জন্য এখানে ক্লিক করুন


1
আমি মনে করি এটি একটি উত্তম উত্তর, যেখানে অংশটি যেখানে সত্য ফিরে আসবে except আমি ইভেন্টটি গ্রাস করার প্রয়োজন হলেই সত্যটিতে ফিরে আসার পরামর্শ দেব (স্পর্শের অঙ্গভঙ্গিটি সঠিক জায়গায় ঘটেছে)।
বিয়ানকা ড্যানিসিক

12

সর্বশেষ অবদানের ব্যবহারটি contains(x,y)সরাসরি getBounds()"বাম" অঙ্কনযোগ্য ব্যবহারের ক্ষেত্রে, কাকতালীয়ভাবে বাদ দিয়ে) ফলাফলটিতে সরাসরি কাজ করবে না । getBoundsপদ্ধতিটি কেবল উপলব্ধ Rect0,0 এ উৎপত্তি সঙ্গে স্বাভাবিক অঙ্কনযোগ্য আইটেমের সংজ্ঞা পয়েন্ট - তাই, আপনি আসলে খুঁজে বের করতে যদি ক্লিক প্রেক্ষাপটে অঙ্কনযোগ্য ক্ষেত্রে হয় মূল পোস্টের গণিত যা করতে হবে এডিটেক্সটসের ডাইমেনশন রয়েছে তবে এটি উপরে, ডান, বাম ইত্যাদির জন্য পরিবর্তন করুন বিকল্পভাবে আপনি এমন কোনও বর্ণনা করতে পারেন Rectযা EditTextধারক এবং ব্যবহারের অবস্থানের সাথে তুলনামূলকভাবে স্থানাঙ্কযুক্ত রয়েছে contains(), যদিও শেষ পর্যন্ত আপনি একই গণিত করছেন।

তাদের উভয় সংমিশ্রণ আপনাকে একটি চমত্কার সম্পূর্ণ সমাধান দেয়, আমি কেবলমাত্র একটি ইভেন্ট অ্যাট্রিবিউট যুক্ত করেছি consumesEventযা এপিআই ব্যবহারকারীকে সিদ্ধান্ত নিতে দেয় যে ক্লিক ইভেন্টটি সেট করা ACTION_CANCELবা না করাতে এর ফলাফল ব্যবহার করে পাস করা উচিত কিনা ।

এছাড়াও, আমি দেখতে পাচ্ছি না কেন boundsএবং actionX, actionYমানগুলি স্ট্যাকের উপর কেবল স্থানীয়ের চেয়ে উদাহরণ বৈশিষ্ট্য।

উপরের ভিত্তিতে একটি বাস্তবায়ন থেকে কাটআউট যা আমি একসাথে রেখেছি। এটি এমন একটি সমস্যা সমাধান করেছে যা ইভেন্টটিকে সঠিকভাবে গ্রাস করতে আপনার মিথ্যা প্রত্যাবর্তনের প্রয়োজন। এটিতে একটি "ফাজ" ফ্যাক্টর যুক্ত হয়। কোনও ক্ষেত্রে কোনও ভয়েস নিয়ন্ত্রণ আইকন ব্যবহারের ক্ষেত্রে EditText, আমি ক্লিক করতে অসুবিধে হয়েছিলাম, তাই ফাজটি কার্যকর সীমাগুলিকে বাড়িয়ে তোলে যা অঙ্কনযোগ্যকে ক্লিক করার বিষয়টি বিবেচনা করা হয়। আমার জন্য 15ভাল কাজ। আমার কেবলমাত্র প্রয়োজন ছিল drawableRightতাই আমি অন্য জায়গাটিতে গণিতটি প্লাগ না করি, কিছু জায়গা বাঁচাতে, তবে আপনি ধারণাটি দেখতে পান।

package com.example.android;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.EditText;
import android.graphics.Rect;

import com.example.android.DrawableClickListener;

public class ClickableButtonEditText extends EditText {
  public static final String LOG_TAG = "ClickableButtonEditText";

  private Drawable drawableRight;
  private Drawable drawableLeft;
  private Drawable drawableTop;
  private Drawable drawableBottom;
  private boolean consumeEvent = false;
  private int fuzz = 0;

  private DrawableClickListener clickListener;

  public ClickableButtonEditText(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  public ClickableButtonEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public ClickableButtonEditText(Context context) {
    super(context);
  }

  public void consumeEvent() {
    this.setConsumeEvent(true);
  }

  public void setConsumeEvent(boolean b) {
    this.consumeEvent = b;
  }

  public void setFuzz(int z) {
    this.fuzz = z;
  }

  public int getFuzz() {
    return fuzz;
  }

  @Override
  public void setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom) {
    if (right != null) {
      drawableRight = right;
    }

    if (left != null) {
      drawableLeft = left;
    }
    super.setCompoundDrawables(left, top, right, bottom);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
      int x, y;
      Rect bounds;
      x = (int) event.getX();
      y = (int) event.getY();
      // this works for left since container shares 0,0 origin with bounds
      if (drawableLeft != null) {
        bounds = drawableLeft.getBounds();
        if (bounds.contains(x - fuzz, y - fuzz)) {
          clickListener.onClick(DrawableClickListener.DrawablePosition.LEFT);
          if (consumeEvent) {
            event.setAction(MotionEvent.ACTION_CANCEL);
            return false;
          }
        }
      } else if (drawableRight != null) {
        bounds = drawableRight.getBounds();
        if (x >= (this.getRight() - bounds.width() - fuzz) && x <= (this.getRight() - this.getPaddingRight() + fuzz) 
              && y >= (this.getPaddingTop() - fuzz) && y <= (this.getHeight() - this.getPaddingBottom()) + fuzz) {

          clickListener.onClick(DrawableClickListener.DrawablePosition.RIGHT);
          if (consumeEvent) {
            event.setAction(MotionEvent.ACTION_CANCEL);
            return false;
          }
        }
      } else if (drawableTop != null) {
        // not impl reader exercise :)
      } else if (drawableBottom != null) {
        // not impl reader exercise :)
      }
    }

    return super.onTouchEvent(event);
  }

  @Override
  protected void finalize() throws Throwable {
    drawableRight = null;
    drawableBottom = null;
    drawableLeft = null;
    drawableTop = null;
    super.finalize();
  }

  public void setDrawableClickListener(DrawableClickListener listener) {
    this.clickListener = listener;
  }
}

11

আমি মনে করি আমরা যদি কিছু কৌশল ব্যবহার করি তবে এটি আরও সহজ is

  1. আপনার আইকন সহ একটি চিত্র বোতাম তৈরি করুন এবং স্বচ্ছ হতে এর পটভূমির রঙ সেট করুন ।
  2. ডান হাতের এডিটেক্সট এবং কোজের চিত্র বোতামটি রাখুন
  3. আপনার ফাংশনটি সম্পাদন করতে বোতামটির অনক্লিক শ্রোতার প্রয়োগ করুন

সম্পন্ন


1
RelativeLayoutযথাযথ অবস্থান অর্জনের জন্য ব্যবহৃত হয়, অন্য সমাধানগুলির চেয়ে কম সংশ্লেষিত এবং বজায় রাখার জন্য অনেক কম কোড বলে মনে হয়।
C0D3LIC1OU5

8

কোটলিন একটি দুর্দান্ত ভাষা যেখানে প্রতিটি শ্রেণি নতুন পদ্ধতি সহ প্রসারিত হতে পারে। এডিটেক্সট ক্লাসের জন্য নতুন পদ্ধতি প্রবর্তন করা যাক যা ক্লিক করে ডান আঁকতে সক্ষম হবে।

fun EditText.onRightDrawableClicked(onClicked: (view: EditText) -> Unit) {
this.setOnTouchListener { v, event ->
    var hasConsumed = false
    if (v is EditText) {
        if (event.x >= v.width - v.totalPaddingRight) {
            if (event.action == MotionEvent.ACTION_UP) {
                onClicked(this)
            }
            hasConsumed = true
        }
    }
    hasConsumed
}
}

আপনি দেখতে পাচ্ছেন এটি কলব্যাক ফাংশনটিকে আর্গুমেন্ট হিসাবে গ্রহণ করে যা ডাকা হয় যখন ব্যবহারকারী ক্লিক করে।

val username = findViewById<EditText>(R.id.username_text)
    username.onRightDrawableClicked {
        it.text.clear()
    }

7

আরয়ানএম এর ধারণাকে প্রসারিত করে আমি আরও নমনীয় সংস্করণ তৈরি করেছি, যা সমস্ত আঁকানো ধরণের (উপরে, নীচে, বাম, ডান) সমর্থন করে। নীচের কোডটি পাঠ্যদর্শনকে প্রসারিত করার সাথে সাথে এডিটেক্সট-এর জন্য মানিয়ে নেওয়া কেবল "এক্সটেন্ডেড এডিট টেক্সট" সহ "টেক্সটভিউ প্রসারিত" এর অদলবদলের একটি বিষয় মাত্র। এক্সএমএল থেকে উইজেট ইনস্ট্যান্টেশন করা রায়য়ান-এর উদাহরণের মতো, উইজেটের নামটি বার করুন।


import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.TextView;

import com.example.DrawableClickListener.DrawablePosition;

public class ButtonTextView extends TextView {

private Drawable    drawableRight;
private Drawable    drawableLeft;
private Drawable    drawableTop;
private Drawable    drawableBottom;

private int     actionX, actionY;

private DrawableClickListener clickListener;

public ButtonTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public ButtonTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public ButtonTextView(Context context) {
    super(context);
}

@Override
public void setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom) {
    if (right != null) {
        drawableRight = right;
    }

    if (left != null) {
        drawableLeft = left;
    }

    if (top != null) {
        drawableTop = top;
    }

    if (bottom != null) {
        drawableBottom = bottom;
    }

    super.setCompoundDrawables(left, top, right, bottom);
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        actionX = (int) event.getX();
        actionY = (int) event.getY();

        if (drawableBottom != null && drawableBottom.getBounds().contains(actionX, actionY)) {
            clickListener.onClick(DrawablePosition.BOTTOM);
            return super.onTouchEvent(event);
        }

        if (drawableTop != null && drawableTop.getBounds().contains(actionX, actionY)) {
            clickListener.onClick(DrawablePosition.TOP);
            return super.onTouchEvent(event);
        }

        if (drawableLeft != null && drawableLeft.getBounds().contains(actionX, actionY)) {
            clickListener.onClick(DrawablePosition.LEFT);
            return super.onTouchEvent(event);
        }

        if (drawableRight != null && drawableRight.getBounds().contains(actionX, actionY)) {
            clickListener.onClick(DrawablePosition.RIGHT);
            return super.onTouchEvent(event);
        }
    }


    return super.onTouchEvent(event);
}

@Override
protected void finalize() throws Throwable {
    drawableRight = null;
    drawableBottom = null;
    drawableLeft = null;
    drawableTop = null;
    super.finalize();
}

public void setDrawableClickListener(DrawableClickListener listener) {
    this.clickListener = listener;
}}

অঙ্কনযোগ্য ক্লিকলিস্টার এটির মতো সহজ:

public interface DrawableClickListener {

public static enum DrawablePosition { TOP, BOTTOM, LEFT, RIGHT };
public void onClick(DrawablePosition target); }

এবং তারপরে প্রকৃত বাস্তবায়ন:

class example implements DrawableClickListener {
public void onClick(DrawablePosition target) {
    switch (target) {
        case LEFT:
            doSomethingA();
            break;

        case RIGHT:
            doSomethingB();
            break;

        case BOTTOM:
            doSomethingC();
            break;

        case TOP:
            doSomethingD();
            break;

        default:
            break;
    }
}}

PS: যদি আপনি শ্রোতা সেট না করেন তবে পাঠ্যদর্শনটি স্পর্শ করলে নালপয়েন্টারএক্সেপশন হয়ে যাবে। আপনি কোডটিতে আরও কিছু বিড়ম্বনা যুক্ত করতে চাইতে পারেন।


দেখে মনে হচ্ছে আপনার কোডটি কাজ করছে না, আমি মাত্র পরীক্ষা করেছি এবং যখন অঙ্কনযোগ্যকে স্পর্শ করি তখন কিছুই হয় না।
থিয়াগো

7

এটা আমার জন্য কাজ করে,

mEditTextSearch.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if(s.length()>0){
                mEditTextSearch.setCompoundDrawablesWithIntrinsicBounds(null, null, getResources().getDrawable(android.R.drawable.ic_delete), null);
            }else{
                mEditTextSearch.setCompoundDrawablesWithIntrinsicBounds(null, null, getResources().getDrawable(R.drawable.abc_ic_search), null);
            }
        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
        @Override
        public void afterTextChanged(Editable s) {
        }
    });
    mEditTextSearch.setOnTouchListener(new OnTouchListener() {
        @SuppressLint("ClickableViewAccessibility")
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_UP) {
                if(mEditTextSearch.getCompoundDrawables()[2]!=null){
                    if(event.getX() >= (mEditTextSearch.getRight()- mEditTextSearch.getLeft() - mEditTextSearch.getCompoundDrawables()[2].getBounds().width())) {
                        mEditTextSearch.setText("");
                    }
                }
            }
            return false;
        }
    });

হিট আয়তক্ষেত্রের সূচনা করার সময় পাঠ্য সম্পাদনা করার জন্য ডান প্যাডিং বিয়োগ করা দরকার।
farid_z

4

আমি জানি এটি বেশ পুরানো, তবে সম্প্রতি আমি একইরকম কিছু করতে হয়েছিল ... এটি কতটা কঠিন তা দেখার পরে আমি একটি আরও সহজ সমাধান নিয়ে এসেছি:

  1. একটি এক্সএমএল লেআউট তৈরি করুন যাতে সম্পাদনা পাঠ এবং চিত্র রয়েছে
  2. সাবক্লাস ফ্রেমলআউট এবং এক্সএমএল লেআউটকে স্ফীত করে
  3. ক্লিক শ্রোতার জন্য কোড যুক্ত করুন এবং অন্য যে কোনও আচরণ আপনি চান

আমার ক্ষেত্রে আমার একটি সম্পাদনা পাঠের দরকার ছিল যাতে একটি বোতাম দিয়ে পাঠ্য সাফ করার ক্ষমতা ছিল। আমি এটি সার্চভিউয়ের মতো দেখতে চেয়েছিলাম, তবে বেশ কয়েকটি কারণে আমি এই শ্রেণিটি ব্যবহার করতে চাইনি। নীচের উদাহরণটি দেখায় যে আমি কীভাবে এটি সম্পাদন করেছি। যদিও ফোকাস পরিবর্তনের সাথে এটি করার দরকার নেই, তবুও নীতিগুলি একই রকম এবং আমি বুঝতে পেরেছিলাম যে উদাহরণটি ঠিক মতো কাজ করতে পারে না এমন উদাহরণ স্থাপনের চেয়ে বাস্তব কার্য কোড পোস্ট করা আরও বেশি উপকারী হবে:

আমার লেআউটটি এখানে: ক্লিয়ারযোগ্য_ডিট_টেক্সট.এক্সএমএল

<merge
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/edit_text_field"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <!-- NOTE: Visibility cannot be set to "gone" or the padding won't get set properly in code -->
    <ImageButton
        android:id="@+id/edit_text_clear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right|center_vertical"
        android:background="@drawable/ic_cancel_x"
        android:visibility="invisible"/>
</merge>

এবং এখানে এমন শ্রেণি রয়েছে যা সেই লেআউটটিকে স্ফীত করে: ক্লিয়ারেবলডিটেক্সট.জভা

public class ClearableEditText extends FrameLayout {
    private boolean mPaddingSet = false;

    /**
     * Creates a new instance of this class.
     * @param context The context used to create the instance
     */
    public ClearableEditText (final Context context) {
        this(context, null, 0);
    }

    /**
     * Creates a new instance of this class.
     * @param context The context used to create the instance
     * @param attrs The attribute set used to customize this instance
     */
    public ClearableEditText (final Context context, final AttributeSet attrs) {
        this(context, attrs, 0);
    }

    /**
     * Creates a new instance of this class.
     * @param context The context used to create the instance
     * @param attrs The attribute set used to customize this instance
     * @param defStyle The default style to be applied to this instance
     */
    public ClearableEditText (final Context context, final AttributeSet attrs, final int defStyle) {
        super(context, attrs, defStyle);

        final LayoutInflater inflater = LayoutInflater.from(context);
        inflater.inflate(R.layout.clearable_edit_text, this, true);
    }

    @Override
    protected void onFinishInflate () {
        super.onFinishInflate();

        final EditText editField = (EditText) findViewById(R.id.edit_text_field);
        final ImageButton clearButton = (ImageButton) findViewById(R.id.edit_text_clear);

        //Set text listener so we can show/hide the close button based on whether or not it has text
        editField.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged (final CharSequence charSequence, final int i, final int i2, final int i3) {
                //Do nothing here
            }

            @Override
            public void onTextChanged (final CharSequence charSequence, final int i, final int i2, final int i3) {
                //Do nothing here
            }

            @Override
            public void afterTextChanged (final Editable editable) {
                clearButton.setVisibility(editable.length() > 0 ? View.VISIBLE : View.INVISIBLE);
            }
        });

        //Set the click listener for the button to clear the text. The act of clearing the text will hide this button because of the
        //text listener
        clearButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick (final View view) {
                editField.setText("");
            }
        });
    }

    @Override
    protected void onLayout (final boolean changed, final int left, final int top, final int right, final int bottom) {
        super.onLayout(changed, left, top, right, bottom);

        //Set padding here in the code so the text doesn't run into the close button. This could be done in the XML layout, but then if
        //the size of the image changes then we constantly need to tweak the padding when the image changes. This way it happens automatically
        if (!mPaddingSet) {
            final EditText editField = (EditText) findViewById(R.id.edit_text_field);
            final ImageButton clearButton = (ImageButton) findViewById(R.id.edit_text_clear);

            editField.setPadding(editField.getPaddingLeft(), editField.getPaddingTop(), clearButton.getWidth(), editField.getPaddingBottom());
            mPaddingSet = true;
        }
    }
}

প্রশ্নের উত্তরকে আরও সামঞ্জস্য করার জন্য নিম্নলিখিত পদক্ষেপগুলি গ্রহণ করা উচিত:

  1. অঙ্কনযোগ্য উত্সটি আপনি যা চান পরিবর্তন করুন ... আমার ক্ষেত্রে এটি ছিল ধূসর এক্স X
  2. সম্পাদনা পাঠ্যে একটি ফোকাস পরিবর্তন শ্রোতা যুক্ত করুন ...

3

এবং যদি অঙ্কনযোগ্য বাম দিকে থাকে তবে এটি আপনাকে সহায়তা করবে। (আরটিএল লেআউট সহ যারা কাজ করেন)

 editComment.setOnTouchListener(new 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() <= (searchbox.getLeft() + searchbox.getCompoundDrawables()[DRAWABLE_LEFT].getBounds().width())) {
                                     // your action here

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

এটি নিখুঁত অবস্থানগুলি "getRawX" সাথে আপেক্ষিক অবস্থানগুলির "getRight" এর সাথে মিশ্রিত করছে। আপনি যদি সম্পাদনা পাঠ্যে একটি ডান বা বাম মার্জিন সেট করেন আপনি দেখতে পাবেন কীভাবে এই ভুল বিরতিতে ক্লিকের সূত্রপাত ঘটে।
সোতি 12

3

কেবল নীচের কোডটি পেস্ট করুন এবং এটি কৌশলটি করে।

editMsg.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() >= (editMsg.getRight() - editMsg.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {
                    // your action here

                    Toast.makeText(ChatActivity.this, "Message Sent", Toast.LENGTH_SHORT).show();
                    return true;
                }
            }
            return false;
        }
    });

1
এটি আমার পক্ষে কাজ করেছে তবে আমাকে getRawX () এর পরিবর্তে getX () ব্যবহার করতে হয়েছিল। আমি মনে করি getRawX () কেবল তখনই কাজ করে যদি দৃশ্যটি পর্দার বাম প্রান্তে থাকে।
গ্লেন

1
পজিশনের গণনা ভুল। পরম স্থানাঙ্ক মিশ হয় "getRawX ()", মত আপেক্ষিক বেশী সঙ্গে "getRight ()"
Sotti

3

আগের সমাধানগুলির কোনওটিই জামারিন অ্যান্ড্রয়েডে আমার পক্ষে কাজ করে নি । আমি নিম্নলিখিতটি ব্যবহার করে সঠিক অঙ্কনযোগ্য ক্লিক শ্রোতাদের কাজ করতে সক্ষম হয়েছি:

নিম্নলিখিত OnEditTextTouchইভেন্ট শ্রোতা তৈরি করুন :

  private void OnEditTextTouch(object sender, View.TouchEventArgs e)
    {
        var rightDrawable = _autoCompleteTextViewSearch.GetCompoundDrawables()[2];

        if (rightDrawable == null || e.Event.Action != MotionEventActions.Up)
        {
            e.Handled = false;

            return;
        }

        if (e.Event.GetX() >= _autoCompleteTextViewSearch.Width - _autoCompleteTextViewSearch.TotalPaddingRight)
        {
            // Invoke your desired action here.

            e.Handled = true;
        }

        // Forward the event along to the sender (crucial for default behaviour)
        (sender as AutoCompleteTextView)?.OnTouchEvent(e.Event);
    }

টাচ ইভেন্টে সাবস্ক্রাইব করুন:

_autoCompleteTextViewSearch.Touch += OnEditTextTouch;

2

এটি সব দুর্দান্ত তবে কেন এটি সত্যই সহজ করা যায় না?

আমি এর মুখোমুখি হয়েছি এত দিন আগেও ... এবং অ্যান্ড্রয়েড টাচলিস্টাইনার দুর্দান্ত কাজ করে তবে ব্যবহারের ক্ষেত্রে সীমাবদ্ধতা দেয়..আমি আরও একটি সমাধান নিয়ে এসেছি এবং আমি আশা করি যে আপনাকে সহায়তা করবে:

    <LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/zero_row">
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="wrap_content"
            android:layout_height="match_parent">
            <ProgressBar
                android:id="@+id/loadingProgressBar"
                android:layout_gravity="center"
                android:layout_width="28dp"
                android:layout_height="28dp" />
        </LinearLayout>
        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:background="@drawable/edittext_round_corners"
            android:layout_height="match_parent"
            android:layout_marginLeft="5dp">
            <ImageView
                android:layout_width="28dp"
                android:layout_height="28dp"
                app:srcCompat="@android:drawable/ic_menu_search"
                android:id="@+id/imageView2"
                android:layout_weight="0.15"
                android:layout_gravity="center|right"
                android:onClick="OnDatabaseSearchEvent" />
            <EditText
                android:minHeight="40dp"
                android:layout_marginLeft="10dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/edittext_round_corners"
                android:inputType="textPersonName"
                android:hint="Search.."
                android:textColorHint="@color/AndroidWhite"
                android:textColor="@color/AndroidWhite"
                android:ems="10"
                android:id="@+id/e_d_search"
                android:textCursorDrawable="@color/AndroidWhite"
                android:layout_weight="1" />
            <ImageView
                android:layout_width="28dp"
                android:layout_height="28dp"
                app:srcCompat="@drawable/ic_oculi_remove2"
                android:id="@+id/imageView3"
                android:layout_gravity="center|left"
                android:layout_weight="0.15"
                android:onClick="onSearchEditTextCancel" />
        </LinearLayout>

        <!--android:drawableLeft="@android:drawable/ic_menu_search"-->
        <!--android:drawableRight="@drawable/ic_oculi_remove2"-->

    </LinearLayout>

</LinearLayout>

এখানে চিত্র বর্ণনা লিখুন এখন আপনি চিত্রক্লিক শ্রোতা বা ইভেন্ট তৈরি করতে এবং পাঠ্যের সাহায্যে যা করতে চান তা করতে পারেন। এই edittext_round_corners.xML ফাইল

<item android:state_pressed="false" android:state_focused="false">
    <shape>
        <gradient
            android:centerY="0.2"
            android:startColor="@color/colorAccent"
            android:centerColor="@color/colorAccent"
            android:endColor="@color/colorAccent"
            android:angle="270"
            />
        <stroke
            android:width="0.7dp"
            android:color="@color/colorAccent" />
        <corners
            android:radius="5dp" />
    </shape>
</item>


এই পদ্ধতির সমস্যাটি হ'ল আপনি এডিট টেক্সটে পাঠ্যের আকার পরিবর্তন শুরু করার সাথে সাথেই পৃথক হয়ে যায়। আপনি ভাবতে পারেন যে এটি কেবল বিকাশকারীর পক্ষে তবে এটি ডিভাইসগুলির সেটিংসে টেক্সট আকারের যতদূর সম্ভব নয় You আপনি এডিট টেক্সটে এসপির পরিবর্তে ডিপি ব্যবহার এড়াতে পারবেন তবে এটি বিষয়টিকে আরও খারাপ করে তোলে। অন্যান্য সমস্যাগুলি হ'ল মাল্টলাইন এডিটেক্সটগুলি হ্যান্ডল করার মতো জিনিস।
সোটি

আমি এটি বহু-লাইন অনুসন্ধানের জন্য কখনই ব্যবহার করি নি, তাই দুঃখিত আমি কখনও ভাবিনি যে এই সমস্যাটি দেখা দিতে পারে। সম্ভবত মাল্টি লাইনের জন্য ব্লক করা সহায়তা করবে। আপনি কি অ্যাপ্লিকেশনটির স্ক্রিনশট সংযুক্ত করতে পারেন বা কী ঘটে তা দেখতে দেখতে পারেন? এবং আমি এটি সমাধান করার চেষ্টা করব এবং ভবিষ্যতে ব্যবহারের জন্য আপনাকে (এই কোডটি ঠিক করুন) এবং আমাকে সহায়তা করব। ধন্যবাদ।
জেভেনিজ কনোনভ

এটি অনুলিপি করা খুব সহজ, আপনি 2 লাইন যুক্ত করার সাথে সাথে এটি লেআউট পূর্বরূপেও ঘটে happens
সোতি

এর জন্য একটি পটভূমি EditTextহওয়া উচিত android:background="@android:color/transparent"
কুলমাইন্ড

1

সম্পাদনা পাঠ্যের ডানদিকে ইমেজবাটন থাকা এবং সম্পাদনা পাঠ্যের সাথে ওভারল্যাপে নেতিবাচক লেআউট মার্জিন দেওয়া ভাল। ইমেজবাটনে শ্রোতাদের সেট করুন এবং ক্রিয়াকলাপ করুন।


1
@Override
    public boolean onTouch(View v, MotionEvent event) {

        Drawable drawableObj = getResources().getDrawable(R.drawable.search_btn);
        int drawableWidth = drawableObj.getIntrinsicWidth();

        int x = (int) event.getX();
        int y = (int) event.getY();

        if (event != null && event.getAction() == MotionEvent.ACTION_UP) {
            if (x >= (searchPanel_search.getWidth() - drawableWidth - searchPanel_search.getPaddingRight())
                    && x <= (searchPanel_search.getWidth() - searchPanel_search.getPaddingRight())

                    && y >= searchPanel_search.getPaddingTop() && y <= (searchPanel_search.getHeight() - searchPanel_search.getPaddingBottom())) {

                getSearchData();
            }

            else {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(searchPanel_search, InputMethodManager.SHOW_FORCED);
            }
        }
        return super.onTouchEvent(event);

    }

1
<FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="5dp" >

            <EditText
                android:id="@+id/edt_status_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="10dp"
                android:background="@drawable/txt_box_blank"
                android:ems="10"
                android:hint="@string/statusnote"
                android:paddingLeft="5dp"
                android:paddingRight="10dp"
                android:textColor="@android:color/black" />

            <Button
                android:id="@+id/note_del"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:layout_marginRight="1dp"
                android:layout_marginTop="5dp"
                android:background="@android:drawable/ic_delete" />
        </FrameLayout>

এই পদ্ধতির সমস্যাটি হ'ল আপনি এডিট টেক্সটে পাঠ্যের আকার পরিবর্তন শুরু করার সাথে সাথেই পৃথক হয়ে যায়। আপনি ভাবতে পারেন যে এটি কেবল বিকাশকারীর পক্ষে তবে এটি ডিভাইসগুলির সেটিংসে টেক্সট আকারের যতদূর সম্ভব নয় You আপনি এডিট টেক্সটে এসপির পরিবর্তে ডিপি ব্যবহার এড়াতে পারবেন তবে এটি বিষয়টিকে আরও খারাপ করে তোলে। অন্যান্য সমস্যাগুলি হ'ল
মাল্টলাইন

1

বাম অঙ্কনযোগ্য ক্লিক শ্রোতার জন্য

txt.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            final int DRAWABLE_LEFT = 0;

            if (event.getAction() == MotionEvent.ACTION_UP) {
                if (event.getRawX() <= (txt
                        .getCompoundDrawables()[DRAWABLE_LEFT].getBounds().width() +
                        txt.getPaddingLeft() +
                        txt.getLeft())) {

                          //TODO do code here
                    }
                    return true;
                }
            }
            return false;
        }
    });

এটি নিখুঁত অবস্থানগুলি "getRawX" সাথে আপেক্ষিক অবস্থানগুলির "getRight" এর সাথে মিশ্রিত করছে। আপনি যদি সম্পাদনা পাঠ্যে একটি ডান বা বাম মার্জিন সেট করেন আপনি দেখতে পাবেন কীভাবে এই ভুল বিরতিতে ক্লিকের সূত্রপাত ঘটে।
সোতি 12

1

যৌগিক অঙ্কনযোগ্যগুলি ক্লিকযোগ্য হবে না। অনুভূমিক লিনিয়ারলআউটটিতে পৃথক দর্শন ব্যবহার করা এবং সেগুলিতে একটি ক্লিক হ্যান্ডলার ব্যবহার করা পরিষ্কার is

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:background="@color/white"
        android:layout_marginLeft="20dp"
        android:layout_marginStart="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginEnd="20dp"
        android:layout_gravity="center_horizontal"
        android:orientation="horizontal"
        android:translationZ="4dp">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="@color/white"
            android:minWidth="40dp"
            android:scaleType="center"
            app:srcCompat="@drawable/ic_search_map"/>

        <android.support.design.widget.TextInputEditText
            android:id="@+id/search_edit"
            style="@style/EditText.Registration.Map"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:hint="@string/hint_location_search"
            android:imeOptions="actionSearch"
            android:inputType="textPostalAddress"
            android:maxLines="1"
            android:minHeight="40dp" />

        <ImageView
            android:id="@+id/location_gps_refresh"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="@color/white"
            android:minWidth="40dp"
            android:scaleType="center"
            app:srcCompat="@drawable/selector_ic_gps"/>
</LinearLayout>

এই পদ্ধতির সমস্যাটি হ'ল আপনি এডিট টেক্সটে পাঠ্যের আকার পরিবর্তন শুরু করার সাথে সাথেই পৃথক হয়ে যায়। আপনি ভাবতে পারেন যে এটি কেবল বিকাশকারীর পক্ষে তবে এটি ডিভাইসগুলির সেটিংসে টেক্সট আকারের যতদূর সম্ভব নয় You আপনি এডিট টেক্সটে এসপির পরিবর্তে ডিপি ব্যবহার এড়াতে পারবেন তবে এটি বিষয়টিকে আরও খারাপ করে তোলে। অন্যান্য সমস্যাগুলি হ'ল মাল্টলাইন এডিটেক্সটগুলি হ্যান্ডল করার মতো জিনিস।
সোতি

1

রাক্ষস ক্লিক হ্যান্ডলিং বাস্তবায়ন করতে চায় না এমন যে কেউ। আপনি এ দ্বারা এটি অর্জন করতে পারেন RelativeLayout। এটির সাথে সাথে আপনার কাছে অঙ্কনযোগ্যদের অবস্থান নির্ধারণের জন্য বিনামূল্যে পরিচালনাও রয়েছে।

  <RelativeLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content">

   <android.support.design.widget.TextInputLayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content">

     <android.support.design.widget.TextInputEditText
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
      />
     </android.support.design.widget.TextInputLayout>
     <ImageView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentEnd="true"
       android:layout_centerInParent="true"
       android:src="@drawable/ic_undo"/>
    </RelativeLayout>

ImageViewঅবস্থান হিসাবে আপনি ব্যবহার করেন একই হবে drawableEnd- প্লাস আপনি সমস্ত স্পর্শ শ্রোতা হ্যান্ডলিং প্রয়োজন হবে না। এর জন্য কেবল একটি ক্লিক শ্রোতা ImageViewএবং আপনি যেতে ভাল।


এই পদ্ধতির সমস্যাটি হ'ল আপনি এডিট টেক্সটে পাঠ্যের আকার পরিবর্তন শুরু করার সাথে সাথেই পৃথক হয়ে যায়। আপনি ভাবতে পারেন যে এটি কেবল বিকাশকারীর পক্ষে তবে এটি ডিভাইসগুলির সেটিংসে টেক্সট আকারের যতদূর সম্ভব নয় You আপনি এডিট টেক্সটে এসপির পরিবর্তে ডিপি ব্যবহার এড়াতে পারবেন তবে এটি বিষয়টিকে আরও খারাপ করে তোলে। অন্যান্য সমস্যাগুলি হ'ল
মাল্টলাইন

1

এটি আমার কাজ করে :) এটি আপনাকেও সহায়তা করতে পারে

edit_account_name.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                if (event.getRawX() >= (edit_account_name.getRight())) {
                    //clicked
                   return true;
                }
            }
            return false;
        }
    });

এটি নিখুঁত অবস্থানগুলি "getRawX" সাথে আপেক্ষিক অবস্থানগুলির "getRight" এর সাথে মিশ্রিত করছে। আপনি যদি সম্পাদনা পাঠ্যে একটি ডান বা বাম মার্জিন সেট করেন আপনি দেখতে পাবেন কীভাবে এই ভুল বিরতিতে ক্লিকের সূত্রপাত ঘটে।
সোতি

আমি সম্পাদনা পাঠ্যে ডান মার্জিন যুক্ত করেছি, আমার কোডটি এখনও নিখুঁতভাবে কাজ করে
zohaib khalq

1

আমি বেশ কয়েকটি সমাধান দেখেছি তবে সেগুলির কোনওটির দ্বারা আমি নিশ্চিত হইনি। হয় খুব জটিল বা খুব সহজ (অ-পুনরায় ব্যবহারযোগ্য)।

এই মুহূর্তে এটি আমার প্রিয় পদ্ধতির:

mEditText.setOnTouchListener(
        new OnEditTextRightDrawableTouchListener(mEditText) {
          @Override
          public void OnDrawableClick() {
            // The right drawable was clicked. Your action goes here.
          }
        });

এবং এটি পুনরায় ব্যবহারযোগ্য স্পর্শ শ্রোতা:

import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.EditText;

public abstract class OnEditTextRightDrawableTouchListener implements OnTouchListener {

  private final EditText mEditText;

  public OnEditTextRightDrawableTouchListener(@NonNull final EditText editText) {
    mEditText = editText;
  }

  @Override
  public boolean onTouch(View view, MotionEvent motionEvent) {
    if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
      final int DRAWABLE_RIGHT_POSITION = 2;
      final Drawable drawable = mEditText.getCompoundDrawables()[DRAWABLE_RIGHT_POSITION];
      if (drawable != null) {
        final float touchEventX = motionEvent.getX();
        final int touchAreaRight = mEditText.getRight();
        final int touchAreaLeft = touchAreaRight - drawable.getBounds().width();
        if (touchEventX >= touchAreaLeft && touchEventX <= touchAreaRight) {
          view.performClick();
          OnDrawableClick();
        }
        return true;
      }
    }
    return false;
  }

  public abstract void OnDrawableClick();
}

আপনি এখানে গিস্ট তাকান করতে পারেন।


1

অঙ্কনযোগ্য ডান, বাম, উপরে, ডাউন ক্লিকের জন্য নীচের কোডটি অনুসরণ করুন:

edittextview_confirmpassword.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() >= (edittextview_confirmpassword.getRight() - edittextview_confirmpassword.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {
                // your action here                    edittextview_confirmpassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                return true;
            }
        }else{
            edittextview_confirmpassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

        }
        return false;
    }
});

}


1

আমি কোটলিনে প্রয়োগ করেছি

edPassword.setOnTouchListener { _, event ->
            val DRAWABLE_RIGHT = 2
            val DRAWABLE_LEFT = 0
            val DRAWABLE_TOP = 1
            val DRAWABLE_BOTTOM = 3
            if (event.action == MotionEvent.ACTION_UP) {
                if (event.rawX >= (edPassword.right - edPassword.compoundDrawables[DRAWABLE_RIGHT].bounds.width())) {
                    edPassword.setText("")
                    true
                }
            }
            false
        }

0

এখানে আমার সহজ সমাধানটি দেওয়া হয়েছে, কেবল এটির ImageButtonউপরে রাখুন EditText:

<RelativeLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content">

  <EditText android:id="@+id/editTextName"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:imeOptions="actionSearch"
    android:inputType="text"/>

  <ImageButton android:id="@+id/imageViewSearch"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_action_search"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"/>

</RelativeLayout>

0

আমি অঙ্কনীয় বাম জন্য একটি উপায় প্রস্তাব করতে চাই! আমি এই কোডটি চেষ্টা করেছিলাম।

txtsearch.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent event) {
            final int DRAWABLE_LEFT = 0;
            int start=txtsearch.getSelectionStart();
            int end=txtsearch.getSelectionEnd();
            if(event.getAction() == MotionEvent.ACTION_UP) {
                if(event.getRawX() <= (txtsearch.getLeft() + txtsearch.getCompoundDrawables()[DRAWABLE_LEFT].getBounds().width())) {
                    //Do your action here
                    return true;
                }

            }
            return false;
        }
    });
}

এটি নিখুঁত অবস্থানগুলি "getRawX" সাথে আপেক্ষিক অবস্থানগুলির "getRight" এর সাথে মিশ্রিত করছে। আপনি যদি সম্পাদনা পাঠ্যে একটি ডান বা বাম মার্জিন সেট করেন আপনি দেখতে পাবেন কীভাবে এই ভুল বিরতিতে ক্লিকের সূত্রপাত ঘটে।
সোতি 12

0

আমি @aristo_sh উত্তরটি Mono.Droid (Xamarin) এ প্রয়োগ করেছি, যেহেতু এটি একটি প্রতিনিধি বেনাম পদ্ধতি যা আপনি সত্য বা মিথ্যা ফিরতে পারবেন না আপনাকে e.Event.Handled নিতে হবে। আমি ক্লিক করে কীবোর্ডটিও আড়াল করছি

editText.Touch += (sender, e) => {
                    e.Handled = false;
                    if (e.Event.Action == MotionEventActions.Up)
                    {
                        if (e.Event.RawX >= (bibEditText.Right - (bibEditText.GetCompoundDrawables()[2]).Bounds.Width()))
                        {
                            SearchRunner();
                            InputMethodManager manager = (InputMethodManager)GetSystemService(InputMethodService);
                            manager.HideSoftInputFromWindow(editText.WindowToken, 0);
                            e.Handled = true;
                        }
                    }
                };

0

টেক্সটভিউ যৌগিক অঙ্কনযোগ্য ক্লিক এবং স্পর্শ ইভেন্টগুলি পরিচালনা করার জন্য আমার সাধারণ সমাধান ভাগ করা।

প্রথমে আমাদের একটি স্পর্শ ইভেন্ট হ্যান্ডলার প্রয়োজন:

/**
 * Handles compound drawable touch events.
 * Will intercept every event that happened inside (calculated) compound drawable bounds, extended by fuzz.
 * @see TextView#getCompoundDrawables()
 * @see TextView#setCompoundDrawablesRelativeWithIntrinsicBounds(int, int, int, int)
 */
public abstract class CompoundDrawableTouchListener implements View.OnTouchListener {

    private final String LOG_TAG = "CmpDrawableTouch";

    private final int fuzz;

    public static final int LEFT = 0;
    public static final int TOP = 1;
    public static final int RIGHT = 2;
    public static final int BOTTOM = 3;
    private static final int[] DRAWABLE_INDEXES = {LEFT, TOP, RIGHT, BOTTOM};

    /**
     * Default constructor
     */
    public CompoundDrawableTouchListener() {
        this(0);
    }

    /**
     * Constructor with fuzz
     * @param fuzz desired fuzz in px
     */
    public CompoundDrawableTouchListener(int fuzz) {
        this.fuzz = fuzz;
    }

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        if (!(view instanceof TextView)) {
            Log.e(LOG_TAG, "attached view is not instance of TextView");
            return false;
        }

        TextView textView = (TextView) view;
        Drawable[] drawables = textView.getCompoundDrawables();
        int x = (int) event.getX();
        int y = (int) event.getY();

        for (int i : DRAWABLE_INDEXES) {
            if (drawables[i] == null) continue;
            Rect bounds = getRelativeBounds(i, drawables[i], textView);
            Rect fuzzedBounds = addFuzz(bounds);

            if (fuzzedBounds.contains(x, y)) {
                MotionEvent relativeEvent = MotionEvent.obtain(
                    event.getDownTime(),
                    event.getEventTime(),
                    event.getAction(),
                    event.getX() - bounds.left,
                    event.getY() - bounds.top,
                    event.getMetaState());
                return onDrawableTouch(view, i, bounds, relativeEvent);
            }
        }

        return false;
    }

    /**
     * Calculates compound drawable bounds relative to wrapping view
     * @param index compound drawable index
     * @param drawable the drawable
     * @param view wrapping view
     * @return {@link Rect} with relative bounds
     */
    private Rect getRelativeBounds(int index, @NonNull Drawable drawable, View view) {
        Rect drawableBounds = drawable.getBounds();
        Rect bounds = new Rect();

        switch (index) {
            case LEFT:
                bounds.offsetTo(view.getPaddingLeft(),
                    view.getHeight() / 2 - bounds.height() / 2);
                break;

            case TOP:
                bounds.offsetTo(view.getWidth() / 2 - bounds.width() / 2,
                    view.getPaddingTop());
                break;

            case RIGHT:
                bounds.offsetTo(view.getWidth() - view.getPaddingRight() - bounds.width(),
                    view.getHeight() / 2 - bounds.height() / 2);
                break;

            case BOTTOM:
                bounds.offsetTo(view.getWidth() / 2 - bounds.width() / 2,
                    view.getHeight() - view.getPaddingBottom() - bounds.height());
                break;
        }

        return bounds;
    }

    /**
     * Expands {@link Rect} by given value in every direction relative to its center
     * @param source given {@link Rect}
     * @return result {@link Rect}
     */
    private Rect addFuzz(Rect source) {
        Rect result = new Rect();
        result.left = source.left - fuzz;
        result.right = source.right + fuzz;
        result.top = source.top - fuzz;
        result.bottom = source.bottom + fuzz;
        return result;
    }

    /**
     * Compound drawable touch-event handler
     * @param v wrapping view
     * @param drawableIndex index of compound drawable which recicved the event
     * @param drawableBounds {@link Rect} with compound drawable bounds relative to wrapping view.
     * Fuzz not included
     * @param event event with coordinated relative to wrapping view - i.e. within {@code drawableBounds}.
     * If using fuzz, may return negative coordinates.
     */
    protected abstract boolean onDrawableTouch(View v, int drawableIndex, Rect drawableBounds, MotionEvent event);
}

আপনার পছন্দ মতো যে কোনও টেক্সটভিউয়ের অঙ্কনযোগ্য যেকোন যৌগে এখন আপনি কোনও স্পর্শ ইভেন্টগুলি প্রক্রিয়া করতে পারেন:

textView1.setOnTouchListener(new CompoundDrawableTouchListener() {
            @Override
            protected void onDrawableTouch(View v, int drawableIndex, Rect drawableBounds, MotionEvent event) {
                switch(v.getId()) {
                    case R.id.textView1:
                        switch(drawableIndex) {
                            case CompoundDrawableTouchListener.RIGHT:
                                doStuff();
                                break;
                        }
                        break;
                }
            }
        });

শুধুমাত্র ক্লিকগুলিতে আগ্রহী? মোশনএভেন্ট ক্রিয়া দ্বারা কেবল ফিল্টার আউট:

/**
 * Handles compound drawable click events.
 * @see TextView#getCompoundDrawables()
 * @see TextView#setCompoundDrawablesRelativeWithIntrinsicBounds(int, int, int, int)
 * @see CompoundDrawableTouchListener
 */
public abstract class CompoundDrawableClickListener extends CompoundDrawableTouchListener {

    /**
     * Default constructor
     */
    public CompoundDrawableClickListener() {
        super();
    }

     /**
     * Constructor with fuzz
     * @param fuzz desired fuzz in px
     */
    public CompoundDrawableClickListener(int fuzz) {
        super(fuzz);
    }

    @Override
    protected void onDrawableTouch(View v, int drawableIndex, Rect drawableBounds, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) onDrawableClick(v, drawableIndex);
        return true;
    }

    /**
     * Compound drawable touch-event handler
     * @param v wrapping view
     * @param drawableIndex index of compound drawable which recicved the event
     */
    protected abstract void onDrawableClick(View v, int drawableIndex);
}

আবার আমরা সহজেই যেকোন টেক্সটভিউয়ের আঁকতে সক্ষম যৌগের উপর ক্লিকগুলি সহজেই পরিচালনা করতে পারি:

textView1.setOnTouchListener(new CompoundDrawableClickListener() {
            @Override
            protected void onDrawableClick(View v, int drawableIndex) {
                switch(v.getId()) {
                    case R.id.textView1:
                        switch(drawableIndex) {
                            case CompoundDrawableTouchListener.RIGHT:
                                doStuff();
                                break;
                        }
                        break;
                }
            }
        });

আশা করি আপনিও আমার মতো করে পছন্দ করেছেন। কিছু পরিবর্তন হলে আমি এটিকে এখানে এবং সম্পর্কিত সংক্ষেপে আপডেট করার চেষ্টা করব ।


0

আমি কাস্টম সম্পাদনা পাঠ্যের পরিবর্তে একটি সাধারণ কাস্টম টাচ শ্রোতার শ্রেণি তৈরি করেছি

public class MyTouchListener implements View.OnTouchListener {
private EditText editText;

public MyTouchListener(EditText editText) {
    this.editText = editText;

    setupDrawable(this.editText);
}

private void setupDrawable(final EditText editText) {
    editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if(s.length()>0)
                editText.setCompoundDrawablesWithIntrinsicBounds(0,0, R.drawable.clearicon,0);
            else
                editText.setCompoundDrawablesWithIntrinsicBounds(0,0, 0,0);

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    if(event.getAction() == MotionEvent.ACTION_UP) {
        if(editText.getCompoundDrawables()[2]!=null){
            if(event.getX() >= (editText.getRight()- editText.getLeft() - editText.getCompoundDrawables()[2].getBounds().width())) {
                editText.setText("");
            }
        }
    }
    return false;

}

}

এডিট টেক্সট ফাঁকা থাকলে কোনও অঙ্কনযোগ্য হবে না। এডিট টেক্সট সাফ করার জন্য যখন আমরা সম্পাদনা শুরু করি তখন একটি অঙ্কনীয় প্রদর্শিত হবে।

আপনি কেবল স্পর্শ শ্রোতা সেট করতে পারেন

mEditText.setOnTouchListener (নতুন MyTouchListener (mEditText));


এটি সামান্য বিভ্রান্তিকর যে এস টাচলিস্টেনারটি চিত্রনীয় দৃশ্যমানতা এবং স্পষ্ট ক্রিয়া নিজেই পরিচালনা করছে। এটি কোনও স্পর্শ শ্রোতার দায়িত্ব নয় এবং শ্রেণীর নাম বিভ্রান্তিকর। পাশাপাশি আপনি আপেক্ষিক অবস্থানগুলি গণনা করছেন সমীকরণ থেকে মার্জিনগুলি সরিয়ে ফেলতে হবে না। getRight - প্রস্থ এটি করবে।
সোতি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.