অ্যান্ড্রয়েড বোতামটি সেটআপ করেছেআপন্টচলিসটনার এতে কল করেছে তবে পারফরম্যান্স ক্লিককে ওভাররাইড করে না


112

আমি যখন onTouchListner()কোনও বোতামে যুক্ত করার চেষ্টা করি তখন তা আমার কাছে আসে

বোতামটি সেট করেছেআনটচলিস্টনারকে ডেকেছে তবে পারফরম্যান্স ক্লিককে ওভাররাইড করে না

সাবধানবাণী। কেউ কি জানে এটা কিভাবে ঠিক করে?

1

btnleftclick.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        return false;
    }
});

ত্রুটি:

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


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

: দয়া করে এখানে আমার উত্তর দেখার stackoverflow.com/questions/47170075/...
ল্যামডা

উত্তর:


133

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

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

বিকল্প 1: একটি কাস্টম ভিউ তৈরি করুন

টাচ ইভেন্টগুলি পরিচালনা করা সাধারণত কাস্টম ভিউতে সম্পন্ন এমন কিছু। এই বিকল্পটি খুব দ্রুত খারিজ করবেন না। এটি আসলে এতটা কঠিন নয়। এখানে TextViewটাচের ইভেন্টগুলি পরিচালনা করতে ওভাররাইড হওয়া একটি সম্পূর্ণ উদাহরণ :

public class CustomTextView extends AppCompatTextView {

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

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

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                return true;

            case MotionEvent.ACTION_UP:
                performClick();
                return true;
        }
        return false;
    }

    // Because we call this from onTouchEvent, this code will be executed for both
    // normal touch events and for when the system calls this using Accessibility
    @Override
    public boolean performClick() {
        super.performClick();
        doSomething();
        return true;
    }

    private void doSomething() {
        Toast.makeText(getContext(), "did something", Toast.LENGTH_SHORT).show();
    }
}

তারপরে আপনি এটি কেবল এটির মতো ব্যবহার করবেন:

<com.example.myapp.CustomTextView
    android:id="@+id/textview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="20dp"
    android:text="Click me to do something"/>

দেখুন আমার অন্যান্য জবাব একটি কাস্টম দৃশ্য নির্মাণ সম্পর্কে আরো বিস্তারিত জানার জন্য।

বিকল্প 2: সতর্কতা নিঃশব্দ করা

অন্য সময় কেবল সতর্কবার্তাটি বন্ধ করে দেওয়া ভাল। উদাহরণস্বরূপ, আমি নিশ্চিত নই যে আপনি এটির জন্য কী করতে চান যার জন্য আপনার Buttonস্পর্শ ইভেন্টগুলির প্রয়োজন। আপনি একটি কাস্টম বাটন করতে ছিল এবং বলা তাহলে performClick()মধ্যে onTouchEventআমি কাস্টম জন্য উপরে করেনি TextView, তাহলে এটি দুইবার প্রত্যেক সময় বলা পেতে কারণ Buttonইতিমধ্যে আহ্বান performClick()

এখানে কয়েকটি কারণ যা আপনি কেবল সতর্কতাটি চুপ করে রাখতে চাইতে পারেন:

  • আপনার স্পর্শ ইভেন্টের সাথে আপনি যে কাজটি করছেন তা কেবল চাক্ষুষ। এটি আপনার অ্যাপ্লিকেশনটির আসল কাজকে প্রভাবিত করে না।
  • আপনি শীতল হৃদয় এবং অন্ধদের জন্য বিশ্বের উন্নত জায়গা করার বিষয়ে চিন্তা করবেন না।
  • উপরের বিকল্প 1 এ আমি আপনাকে যে কোডটি দিয়েছি তা অনুলিপি করে আটকানোতে আপনি খুব অলস।

সতর্কতা দমন করতে পদ্ধতির শুরুতে নিম্নলিখিত লাইনটি যুক্ত করুন:

@SuppressLint("ClickableViewAccessibility")

উদাহরণ স্বরূপ:

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

    Button myButton = findViewById(R.id.my_button);
    myButton.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            return false;
        }
    });
}

1
আমি বিভিন্ন ফন্ট ব্যবহার করার কারণে কাস্টমভিউ ব্যবহার করছিলাম। যেমনটি এখন এপিআই 26 তে নতুন বৈশিষ্ট্য প্রবর্তন করেছে, এক্সএমএলে ফন্টগুলি এবং পুরানো সংস্করণের জন্য সমর্থন লাইব্রেরি 26 ব্যবহার করে যা অপি 16 অবধি সমর্থন করে So সুতরাং আমি সমস্ত কাস্টম ভিউগুলি সরিয়েছি। এবং এই নির্বোধ সতর্কতাটি আসে এবং সমাধান হ'ল আমি সেইসাথে সেইসব কাস্টম ভিউ তৈরি করেছি যার জন্য আমি সেটঅনটচলিস্টনার ব্যবহার করছি।
হা হা হা

19
গুগল যদি বুঝতে পারে যে এর দ্বারা তারা কতগুলি বিকাশকারী সময় নষ্ট করে। মানে, তারা সম্ভবত এপিআইয়ের মধ্যে এটি পরিচালনা করতে পারে? সাবক্লাসিং ভিউগুলিতে সময় ব্যয় করা বা এমনকি তার সতর্কতাটি কীভাবে সমাধান করা যায় তা অনুসন্ধান করার জন্য প্রচুর সময় অপচয় করে।
টাটিওভারফ্লো 2'18

MotionEvent eventআপনার doSomething()পদ্ধতিতে যদি প্রয়োজন হয় তবে কী হবে ? আমি চেক করতে হবে event.getY()
ম্যাটিউস গন্ডিম

@ ম্যাটিউস গন্ডিম, আমাকে বলতে হবে যে আমি এখনও কার্যকর করতে খুব পারদর্শী নই performClick()। যদি আমার প্রাথমিক চিন্তা event.getY()প্রকৃত ক্লিক ঘটনা (যেমন চাক্ষুষ UI 'তে প্রভাব) অবিচ্ছেদ্য না হয়, তাহলে যে যুক্তিবিজ্ঞান পিছান onTouchEvent()। অন্যথায় আপনি সর্বশেষ ক্রিয়াকলাপের Yমান সঞ্চয় করতে কোনও শ্রেণীর সদস্য ভেরিয়েবল তৈরি করতে পারেন । আমি আপনাকে কয়েকটি মানক দর্শনের উত্স কোডটি পরীক্ষা করে দেখার পরামর্শ দিচ্ছি যাতে অ্যান্ড্রয়েড কীভাবে এটি প্রয়োগ করে তা দেখুন। এগুলি আরও নিজেই অধ্যয়ন করা দরকার।
সুরগাচ

1
@ সিসিসিসি, সতর্কতাটি যখন আপনি ওভাররাইড করবেন তখন onTouchEvent()না আসে performClick()। এর মধ্যে একটি সোয়াইপ বা ক্লিক বা অন্য কোনও স্পর্শ ইভেন্ট অন্তর্ভুক্ত থাকতে পারে যা আপনি ক্যাপচার চেষ্টা করছেন।
সুরগাচ

17

সমাধান:

  1. একটি ক্লাস তৈরি করুন যা বাটন প্রসারিত করে বা আপনি যে কোনও দৃশ্য ব্যবহার করছেন এবং ওভাররাইড সঞ্চালন ক্লিক করুন ()

    class TouchableButton extends Button {
    
        @Override
        public boolean performClick() {
            // do what you want
            return true;
        }
    }
  2. এখন এই টাচিবল বাটনটি এক্সএমএল এবং / অথবা কোডে ব্যবহার করুন এবং সতর্কতাটি চলে যাবে!


18
এটি সত্যিই স্থূল। বিদ্যমান দর্শনগুলি ব্যবহার করার কোনও উপায় নেই?
দুধ

@ মিল্ক নোপ android.widget.Buttonহার্ডকোডযুক্ত তাই এটি আপনাকে এটি করতে দেয় না। এবং এটি অ্যান্ড্রয়েড দেব দল থেকে খুব ইচ্ছাকৃত বলে মনে হচ্ছে।
tom_mai78101

11

আপনি কি যোগ করার চেষ্টা করেছেন:

view.performClick()

বা দমন টীকা যুক্ত করুন:

@SuppressLint("ClickableViewAccessibility")

?


2
হ্যাঁ. অ্যান্ড্রয়েড স্টুডিও edition.০ সংস্করণ সহ এই ওয়ারিং কমেপ
কস

1
ঠিক আছে, আমার সেই সতর্কবাণী ঠিক করার বিকল্প আছে। দয়া করে দেখুন: stackoverflow.com/questions/47170075/...
ল্যামডা

1

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

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

https://developer.android.com/guide/topics/ui/accessibility/custom-views#custom-touch-events

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