অন্য একটি খণ্ড ইস্যুতে টুকরো টুকরো


271

আমি যখন অন্য একটি খণ্ডের (যখন #77000000পটভূমিতে পূর্ণ পর্দা ) এক টুকরোটি দেখি (আসুন আমরা এটিকে মূল বলি) তখন আমার মূল খণ্ডটি এখনও ক্লিকগুলিতে প্রতিক্রিয়া দেখায় (আমরা যদি একটি বোতাম নাও দেখি তা নাও দেখতে পারি)।

প্রশ্ন : প্রথম (প্রধান) খণ্ডে ক্লিকগুলি কীভাবে প্রতিরোধ করবেন?

সম্পাদনা

দুর্ভাগ্যক্রমে, আমি কেবল প্রধান খণ্ডটি আড়াল করতে পারি না, কারণ আমি দ্বিতীয় খণ্ডে স্বচ্ছ পটভূমি ব্যবহার করছি (সুতরাং, ব্যবহারকারী পিছনে কী দেখতে পারে)।


কি আপনার সাথে কাজ করতে আমাদের দিয়েছেন উপর ভিত্তি করে, আপনি সেট করার চেষ্টা করা উচিত Visibilityআপনার এর main Fragmentথেকে GONEযখন আপনি এটি ব্যবহার করছেন না।
adneal

1
আপনি কীভাবে আপনার অন-ক্লিক করা পদ্ধতিটি বাস্তবায়ন করছেন তা না দেখে, আমি অনুমান করছি যে আপনি ক্লিক করলে "মিথ্যা" ফিরে আসছেন।
DeeV

@ ডিভি, onClickপদ্ধতি কোনও কিছুই ফেরায় না। তবে আপনি একটি ধারণা দিন, ধন্যবাদ (আমি শীঘ্রই উত্তর পোস্ট করব)।
দিমিত্রি জায়েতসেভ

1
ডি ওহ। তুমি ঠিক বলছো. onTouch এটি প্রদান করে। আমি কেবল ইচ্ছে করেই বুঝতে পেরেছিলাম যে কোনও স্পর্শ ইভেন্টটি খণ্ডের মধ্য দিয়ে কেন পড়েছে। আপনি যদি স্পর্শ ইভেন্টগুলি জারি না করেন তবে এটি করা উচিত নয়।
DeeV

@ ডিআইভি, দেখে মনে হচ্ছে আপনার মতামত (যেমন, অন্যের উপরে উদাহরণস্বরূপ) টাচ ইভেন্টটি না ধরছে, তারপরে সিস্টেম একই স্থানাঙ্কের সাহায্যে অন্যান্য মতামত অনুসন্ধান করতে থাকবে।
দিমিত্রি জায়েতসেভ

উত্তর:


578

সেট clickableসত্যতে দ্বিতীয় টুকরা দৃষ্টিভঙ্গি উপর সম্পত্তি। দৃশ্যটি ইভেন্টটি ধরে ফেলবে যাতে এটি মূল খণ্ডে পৌঁছে না যায়। সুতরাং যদি দ্বিতীয় খণ্ডের ভিউটি একটি বিন্যাস হয়, তবে এটি কোড হবে:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true" />

4
এটি আমার পক্ষে কাজ করেছে। @ দিমিত্রি জয়েটসেভ উপরোক্ত সমাধানটির চেয়ে সহজ বলে মনে হচ্ছে। এটির কোনও খারাপ ধারণা হওয়ার কোনও কারণ আছে কি? আমি কারও কথা ভাবি না, তবে আমি নিশ্চিত হতে চাই।
এয়ারেটস

1
এটি আমার পক্ষে কাজ করে না। আমার RelativeLayoutটুকরোটির ভিতরে একটি অংশ রয়েছে এবং আমি clickeableসম্পত্তির সাথে পুরো দৃশ্যটি সেট করি । @ দিমিত্রি এর সমাধান আমার সমস্যার সমাধান করে।
4gus71n

3
এটি আমার পক্ষে কাজ করেছে। অ্যান্ড্রয়েডে "ক্লিকযোগ্য" স্পষ্টতই কিছুটা আইওএস-এর মতো "ইউজার-ইন্টেরাকশনএইনেবলড"
এমভিডিএস

17
অ্যান্ড্রয়েড কেন আমাদের কঠোর কোডিং শর্তের অধীনে রাখে ?!
লো-টান

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

72

সমাধান বেশ সহজ। আমাদের দ্বিতীয় খণ্ডে (এটি আমাদের মূল টুকরোটিকে ওভারল্যাপ করে) আমাদের কেবল onTouchইভেন্টটি ধরা দরকার :

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstance){
    View root = somehowCreateView();

    /*here is an implementation*/

    root.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            return true;
        }
    });
    return root;
}

আপনার সমাধানটি এর জন্য +1 কাজ করেছে তবে আপনি আমাকে বলতে পারেন কেন আমাদের স্পষ্টভাবে এটি করা দরকার?
হান্ট

@ হান্ট আপনার দরকার নেই এটি করার আরেকটি উপায় (গৃহীত উত্তর দেখুন)
দিমিত্রি জায়েতসেভ

অ্যান্ড্রয়েড: আপনার দ্বিতীয় খণ্ডের এক্সএমএল মূল বিন্যাসে ক্লিকযোগ্য = "সত্য"।
habষভ শ্রীবাস্তব

এই সমাধানটিতে একটি সমস্যা আছে, আপনি অ্যাক্সেসিবিলিটি টকব্যাক মোডে চালু করার পরে, এটি পৃথক উপাদানগুলি পড়বে না পরিবর্তে এটি রুট ভিউয়ের দিকে মনোযোগ দেবে।
অমিত গার্গ

কোটলিন সংস্করণ: root.setOnTouchListener {_, _ -> সত্য}
গাল রোম

21

শুধু যোগ clickable="true"এবং focusable="true"পিতা বা মাতা লেআউটে

 <android.support.constraint.ConstraintLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:clickable="true"
      android:focusable="true">

      <!--Your views-->

 </android.support.constraint.ConstraintLayout>

আপনি যদি ব্যবহার করে থাকেন তবে এটি ব্যবহার AndroidXকরে দেখুন

 <androidx.constraintlayout.widget.ConstraintLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:clickable="true"
      android:focusable="true">

          <!--Your views-->

 </androidx.constraintlayout.widget.ConstraintLayout>

এটি কি কোনওভাবে গৃহীত উত্তরের চেয়ে আলাদা? focuseableসত্যিই প্রয়োজনীয় নয়।
দিমিত্রি জায়েতসেভ

2
আমি মনে করি focusable="true"এখানে কেবল অ্যান্ড্রয়েড স্টুডিওতে কোনও সতর্কতা এড়াতে।
আর্টেম এম

9

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

ফ্র্যাগমেন্ট সম্পর্কে সমস্যাগুলি কীভাবে সমাধান করতে হয় সে সম্পর্কে আপনি যদি আরও প্রশ্ন জানতে চান তবে আপনি আমার লাইব্রেরিটি দেখতে পারেন: https://github.com/JustKiddingBaby/FragmentRigger

FirstFragment firstfragment;
SecondFragment secondFragment;
FragmentManager fm;
FragmentTransaction ft=fm.beginTransaction();
ft.hide(firstfragment);
ft.show(secondFragment);
ft.commit();

1
এটি সঠিক উত্তর হওয়া উচিত! আপনি মানুষ ধন্যবাদ. আমি এই প্রশ্নটি অন্য একটি প্রকল্পে সমাধান করেছি। তবে আমি কীভাবে এটি সমাধান করেছি তা ভুলে গিয়েছি এবং শেষ পর্যন্ত আমি আপনার উত্তর পেয়েছি। ধন্যবাদ.
লিক্যাট জুলিয়াস

1
আমি মনে করি না এটিই সঠিক সমাধান। খণ্ডগুলি / ক্রিয়াকলাপগুলি একটি ভিউ স্ট্যাকটিতে কাজ করে। শীর্ষ কল্পনাটি স্ট্যাকটি পপ করার পরে আপনাকে আবারও কল করতে হবে, যার অর্থ নীচের অংশটি অবহিত করতে হবে শীর্ষটি চলে গেছে। এটি বজায় রাখতে অতিরিক্ত যুক্তি যুক্ত করেছে added
এক্সওয়াই

4

আপনি যোগ করতে হবে android:focusable="true"সঙ্গেandroid:clickable="true"

Clickable এর অর্থ এটি একটি পয়েন্টার ডিভাইস দ্বারা ক্লিক করা যেতে পারে বা একটি টাচ ডিভাইস দ্বারা আলতো চাপতে পারে।

Focusableএর অর্থ এটি কোনও কীবোর্ডের মতো কোনও ইনপুট ডিভাইস থেকে ফোকাস অর্জন করতে পারে। কিবোর্ডের মতো ইনপুট ডিভাইসগুলি ইনপুটগুলির উপর ভিত্তি করে কোন ভিউটি তার ইনপুট ইভেন্টগুলি প্রেরণ করবে তা সিদ্ধান্ত নিতে পারে না, তাই তারা ফোকাসযুক্ত দর্শনে তাদের প্রেরণ করে।


2
এবং ফোকাসেবল = "সত্য" প্রয়োজন নতুন অ্যান্ড্রয়েড স্টুডিওতে একটি সতর্কতা এড়াতে
হোসাম হাসান

2

একাধিক সমাধান রয়েছে যা আমাদের মধ্যে কেউ কেউ এই থ্রেডে অবদান রেখেছিল তবে আমি আরও একটি সমাধান উল্লেখ করতে চাই। আপনি যদি ক্লিকযোগ্য এবং ফোকাসেবল রাখার পছন্দ করেন না তবে আমার মতো এক্সএমএলে প্রতিটি লেআউটের রুট ভিউগ্রুপের সাথে সমান। নীচের মতো যদি আপনার একটি থাকে তবে আপনি এটি আপনার বেসেও রাখতে পারেন;

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ) : View? {
        super.onCreateView(inflater, container, savedInstanceState)

        val rootView = inflater.inflate(layout, container, false).apply {
            isClickable = true
            isFocusable = true
        }

        return rootView
    }

আপনি ইনলাইন পরিবর্তনশীলও ব্যবহার করতে পারেন তবে আমি আমার কারণে এটি পছন্দ করি না prefer

আমি আশা করি এটি লেআউট এক্সএমএলকে ঘৃণা করে তাদের জন্য এটি সহায়তা করে।


1

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

কোটলিনে:

fragmentManager.findFragmentByTag(BottomFragment.TAG).view.visibility = GONE

আপনি যখন অ্যানিমেশন ব্যবহার করেন তখন বিকল্প hide()এবং show()পদ্ধতির চেয়ে এই সমাধানটি পছন্দনীয় FragmentTransaction। আপনি শুধু থেকে এটা কল onTransitionStart()এবং onTransitionEnd()এর Transition.TransitionListener


1

মেটোড 1:

আপনি সমস্ত টুকরা বিন্যাসে যোগ করতে পারেন

android:clickable="true"
android:focusable="true"
android:background="@color/windowBackground"

মেটোড 2: (প্রোগ্রামগতভাবে)

FragmentBaseইত্যাদি থেকে সমস্ত খণ্ড প্রসারিত করুন তারপরে এই কোডটি যুক্ত করুনFragmentBase

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    getView().setBackgroundColor(getResources().getColor(R.color.windowBackground));
    getView().setClickable(true);
    getView().setFocusable(true);
}

0

আপনি যা করতে পারেন তা হ'ল সেই মূল টুকরাটির প্যারেন্ট লেআউটে অনক্লিক সম্পত্তি ব্যবহার করে পূর্ববর্তী খণ্ডটির লেআউটে একটি ফাঁকা ক্লিক দিতে পারেন এবং ক্রিয়াকলাপে আপনি একটি ফাংশন তৈরি করতে পারেন doNothing(View view)এবং এতে কোনও কিছুই লিখতে পারবেন না। এটি আপনার জন্য এটি করবে।


0

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


0

যোগ করা android:clickable="true"আমার পক্ষে কাজ করে না। এই সমাধানটি প্যারেন্ট লেআউট হলে CoordinatorLayout এ কাজ করে না। এজন্য আমি রিলেটিভলআউটকে প্যারেন্ট লেআউট হিসাবে তৈরি করেছি, এতে যুক্ত android:clickable="true"করেছি এবং সমন্বয়কারী লেআউটকে এই আপেক্ষিক লেআউটে রেখেছি ।


0

আমার একই এক্সএমএল সহ একাধিক টুকরো ছিল।
ঘন্টা ব্যয় করার পরে, আমি সরিয়েছি setPageTransformerএবং এটি কাজ শুরু করে

   //  viewpager.setPageTransformer(false, new BackgPageTransformer())

আমার ভ্রান্ত যুক্তি ছিল

public class BackgPageTransformer extends BaseTransformer {

    private static final float MIN_SCALE = 0.75f;

    @Override
    protected void onTransform(View view, float position) {
        //view.setScaleX Y
    }

    @Override
    protected boolean isPagingEnabled() {
        return true;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.