অ্যান্ড্রয়েডে কোনও ভিউর অনক্লিক ইভেন্টটি তার পিতামাতার কাছে কীভাবে পাস করবেন?


102

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

এখন আমি যখন টেক্সটভিউতে আলতো চাপছি, ক্লিক ইভেন্টটিকে নির্বাচককে ট্রিগার করতে তার পিতামাতার বিন্যাসে প্রেরণ করা হয় না।

এটি কীভাবে সমাধান করা উচিত?

উত্তর:


46

আমি মনে করি ইভেন্টটি যথাযথ উপাদানগুলিতে প্রেরণের আগে আপনাকে সেগুলি আটকাতে সক্ষম করার জন্য আপনাকে সেগুলির একটি পদ্ধতি ব্যবহার করতে হবে:

Activity.dispatchTouchEvent(MotionEvent) - এটি আপনার ক্রিয়াকলাপটি সমস্ত স্পর্শ ইভেন্টগুলিকে উইন্ডোতে প্রেরণের আগে তাদের বাধা দেওয়ার অনুমতি দেয়।

ViewGroup.onInterceptTouchEvent(MotionEvent) - এটি একটি ভিউগ্রুপকে ইভেন্টের চাইল্ড ভিউতে প্রেরণ করার সাথে সাথে ইভেন্টগুলি দেখার অনুমতি দেয়।

ViewParent.requestDisallowInterceptTouchEvent(boolean) - এটি অনারসেপ্ট টাচইভেন্ট (মোশনইভেন্ট) এর মাধ্যমে স্পর্শ ইভেন্টগুলিকে বাধা দেওয়া উচিত নয় তা বোঝাতে পিতামাতার দৃশ্যের প্রতি এটি কল করুন।

আরও তথ্য এখানে

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


4
প্যারেন্ট ভিউতে অনক্লিক এবং অনলং ক্লিকে ট্রিগার করার জন্য ইভেন্টগুলি পাশ করার সহজ উপায় কি আছে বা আমি সেগুলি নিজেই প্রয়োগ করতে পারি?
শিয়ামি

এটি দেখুন: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 2136696 / pass-event- to- parent-view সম্ভবত আপনি পরামর্শ হিসাবে অন্যান্য উদাহরণগুলিতে একই ক্লিক শ্রোতাদের পাশ কাটিয়ে দেখতে চেষ্টা করতে পারেন, যদিও আমি জানি না এটি কাজ করবে কিনা। , কিন্তু একটি চেষ্টা মূল্য হতে পারে।
লুইস মিগুয়েল সেরানো

নীচের উত্তরটি অনেক পরিষ্কার
JPM

আমি মোশনএভেন্ট ইনস্ট্যান্ট করা উচিত? দয়া করে ব্যাখ্যা করুন, @
লুইস

@ ইলেগারিও, সাধারণত আপনি ওভাররাইডের সাথে একটি নতুন আচরণ সংজ্ঞায়িত করার জন্য উদাহরণের জন্য প্রেরণাদির জন্য উদাহরণটিকে নতুনভাবে সংজ্ঞায়িত করেন, সুতরাং আপনি কেবলমাত্র আপনার ক্রিয়াকলাপ (বা আপনার অ্যাপ্লিকেশনটির অন্য কোনও উপাদান) সরবরাহ করেছেন এমন একটি গতি ইভেন্ট পাবেন you এটি ব্যবহার করুন এবং / অথবা আপনার নিজের নিয়ম অনুসারে যে কোনও সংখ্যক শিশু উপাদানকে ফরোয়ার্ড করুন। এর মতো কিছু: @Override public boolean dispatchTouchEvent(MotionEvent ev) { ... }
লুইস মিগুয়েল সেরানানো

214

আপনার ডিক্লেয়ার TextViewব্যবহার করে না যোগ্য / focusable android:clickable="false"এবং android:focusable="false"বা v.setClickable(false)এবং v.setFocusable(false)। ক্লিক ইভেন্টগুলি TextViewএখন পিতামাতার কাছে প্রেরণ করা উচিত ।

বিঃদ্রঃ:

এটি অর্জন করতে, আপনাকে তার সরাসরি ক্লিক ক্লিক করতে হবে parent। বা সেট android:clickable="false"এবংandroid:focusable="false" এর সরাসরি পিতামাতার কাছে শ্রোতাকে আরও পিতামাতার কাছে প্রেরণ করতে


4
ওহ মানুষ যদি আমি এই +100 দিতে পারতাম। টাচ ইমেজভিউ ভিউটি অন প্রয়োগের সাথে অ্যাডাপ্টারস লেআউটে নয় কীভাবে একটি ক্লিক কেবলমাত্র ভিউপ্যাজারে কাজ করতে হয় তা নির্ধারণের চেষ্টা করা হয়েছে! এই সমাধানটি কবজির মতো কাজ করেছিল।
জেপিএম

4
তবে আমি যদি সম্পাদনা পাঠের ফোকাস পরিবর্তন ইভেন্টটি পরিচালনা করতে চাই?
সুইটওয়িশার

4
দৃশ্যটি হ'ল: আমার একটি লেআউট রয়েছে যাতে সম্পাদনা, আপেক্ষিক বিন্যাস, স্পিনার এবং তালিকার ভিউ রয়েছে। আমি যখনই স্ক্রিনেক্সে এডিটেক্সট এবং স্পিনার
সুইটওয়িশার

9
মনে রাখার মতো গুরুত্বপূর্ণ কিছু হ'ল আপনি যদি এটি ব্যবহার TextView#setOnClickListener()করেন তবে TextViewতা ক্লিকযোগ্য হয়ে ওঠে, এমনকি এটি ঘোষিত android:clickable="false"হলেও, এবং যদি ClickListenerসেটটি সেট করা থাকে null( setOnclickListener(null))
খ্রিস্টান গার্সিয়া

4
মজাদার ঘটনা: যদি টেক্সটভিউতে কোনও android:inputTypeবৈশিষ্ট্য থাকে তবে এটি ক্লিকযোগ্য ইভেন্টের সাথেও চুপচাপ ক্লিক ইভেন্টগুলি গ্রাস করবে: মিথ্যা ও ফোকাসযোগ্য: মিথ্যা; আমার ক্ষেত্রে এটি একটি স্টাইলে সেট করা হয়েছিল এবং কারণটি বের করতে আমার 30 মিনিট ব্যয় হয়েছিল।
কিরিল করমাজিন

18

কিছু সময় কেবল এটিই সহায়তা করে:

View child = parent.findViewById(R.id.btnMoreText);
    child.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            View parent = (View) v.getParent();
            parent.performClick();
        }
    });

অন্য বৈকল্পিক, সবসময় কাজ করে না:

child.setOnClickListener(null);

এটি CardViewশিশু দৃষ্টিভঙ্গির জন্য কাজ করেছে , যেহেতু CardViewমনে হচ্ছে এড়ানো clickable="false"এবং focusable="false"। তবে, পরিবর্তে পিতামাতাকে ব্যবহার করা setOnTouchListenerএবং কল onTouchEventকরা পিতামাতাকে স্পর্শ প্রতিক্রিয়া প্রদর্শনের অনুমতি দেয় (উদাঃ রিপল ইফেক্ট)।
18:56

আমি নীচে প্রাসঙ্গিক কোড পোস্ট করেছি: stackoverflow.com/a/52928884/5652513
54

11

রাখুন

android:duplicateParentState="true"

সন্তানের মধ্যে তারপরে দৃষ্টিভঙ্গিগুলি তার নিজের থেকে তার পরিবর্তে তার প্রত্যক্ষ পিতা-মাতার কাছ থেকে আঁকতে পারা যায় (দৃষ্টি নিবদ্ধ করা, চাপানো ইত্যাদি)। আপনি পিতামাতার জন্য অনক্লিক সেট করতে পারেন এবং এটি ক্লিক করা শিশুকে কল করতে পারে


4
সন্তানের ক্লিক করা হলে পিতামাতার ক্লিক শ্রোতাদের কল করতে চান ওপি, বিপরীতে নয়।
ফরিদ

3

আপনার এক্সএমএল ফাইল থেকে TextViewসরানোর চেয়ে যদি আপনি ক্লিকের সমস্যাগুলি তৈরি করেন android:inputType=""


যদি আপনি না জানেন তবে আমি আপনাকে এটি না করার পরামর্শ দিই। প্রত্যেককে নিজের কথা বলছি ...
dell116

আপনার এটি সেট করা উচিতandroid:inputType="none"
এজেড_আর

1

এই উত্তরটি আলেকজান্ডার উখভের উত্তরের অনুরূপ , এটি ক্লিক ইভেন্টগুলির পরিবর্তে স্পর্শ ইভেন্টগুলি ব্যবহার করে। এই ইভেন্টগুলি পিতামাতাকে যথাযথ চাপা রাষ্ট্রগুলি (যেমন, রিপল প্রভাব) প্রদর্শন করার অনুমতি দেয়। এই উত্তরটি জাবার পরিবর্তে কোটলিনেও রয়েছে।

view.setOnTouchListener { view, motionEvent ->
    (view.parent as View).onTouchEvent(motionEvent)
}

0

আপনি যদি উভয়ই চান OnTouchএবং OnClickপিতা-মাতা এবং শিশু উভয়ই শ্রোতার কাছে চান তবে দয়া করে নীচের কৌশলটি ব্যবহার করুন:

  1. ব্যবহারকারী স্ক্রোলভিউকে পিতামাতার মতামত হিসাবে এবং এর অভ্যন্তরে আপনার সন্তানের দৃশ্যটিকে সম্পর্কিত / লিনিয়ারলআউটের ভিতরে রাখে।

  2. প্যারেন্ট স্ক্রোলভিউ তৈরি করুন android:fillViewport="true"যাতে দেখুন স্ক্রোল না হয়।

  3. তারপরে OnTouchপিতামাতার OnClickকাছে শ্রোতাদের এবং শিশু দর্শনের শ্রোতাদের সেট করুন । এবং শ্রোতার উভয় কলব্যাক উপভোগ করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.