আমি বর্তমানে প্রদর্শিত খণ্ডটি কীভাবে পেতে পারি?


444

আমি অ্যান্ড্রয়েডে টুকরো টুকরো করে খেলছি।

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

FragmentManager fragMgr = getSupportFragmentManager();
FragmentTransaction fragTrans = fragMgr.beginTransaction();

MyFragment myFragment = new MyFragment(); //my custom fragment

fragTrans.replace(android.R.id.content, myFragment);
fragTrans.addToBackStack(null);
fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragTrans.commit();

আমার প্রশ্নটি, একটি জাভা ফাইলে, আমি বর্তমানে প্রদর্শিত ফ্রেগমেন্ট উদাহরণটি কীভাবে পেতে পারি?



উত্তর:


453

আপনি যখন আপনার লেনদেনে খণ্ড যুক্ত করবেন তখন আপনার একটি ট্যাগ ব্যবহার করা উচিত।

fragTrans.replace(android.R.id.content, myFragment, "MY_FRAGMENT");

... এবং পরে আপনি যদি খণ্ডটি দৃশ্যমান কিনা তা পরীক্ষা করতে চান:

MyFragment myFragment = (MyFragment)getFragmentManager().findFragmentByTag("MY_FRAGMENT");
if (myFragment != null && myFragment.isVisible()) {
   // add your code here
}

Http://developer.android.com/references/android/app/Fraament.html এও দেখুন


74
ঠিক আছে, তবে আমার তত্ক্ষণাত্‍ প্রদর্শিত টুকরো টুকরোটি তাত্ক্ষণিকভাবে পাওয়ার জন্য একটি উপায় প্রয়োজন, পুনরাবৃত্তভাবে সমস্ত খণ্ডগুলি পরীক্ষা না করে তারপরে সিদ্ধান্ত নিন যে এখন কোন অংশটি স্ক্রিনে প্রদর্শিত হবে। আমি মনে করি আপনার উত্তরটি আমার পুনরায় পুনরায় পুনরায় টুকরো টুকরো পরীক্ষা করার জন্য, এবং দৃশ্যমানটির সন্ধান করার জন্য আমার কোডের প্রয়োজন ...
Leem.fin

33
হ্যাঁ, তবে একসাথে একাধিক টুকরো দৃশ্যমান হতে পারে। সুতরাং "একমাত্র সক্রিয় খণ্ড" এর মতো কিছুই নেই ....
রামড্রয়েড

6
ঠিক আছে, এমনকি বেশ কয়েকটি টুকরো প্রদর্শিত হয়েছে, এখনও সেগুলি পাওয়ার জন্য আমার একটি উপায় প্রয়োজন ... এবং আমার প্রতিটি টুকরো পুনরুদ্ধার করে পরীক্ষা করার চেয়ে ভাল এমন একটি উপায়। GetDisplayedFraament () এর মতো একটি পদ্ধতি "তাদের পান" সম্পর্কে আমি উদ্বিগ্ন, তবে অ্যান্ড্রয়েডে এমন পদ্ধতি আছে কিনা তা নিশ্চিত নয়
Leem.fin

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

12
সবাই কেন এই উত্তরটিকে সমর্থন করছে? অবশ্যই, এটি কোডের একটি দুর্দান্ত বিট তবে ট্যাগ দ্বারা নির্দিষ্ট খণ্ডটি পাওয়ার জন্য প্রশ্নের উত্তর দেয় না .. তবে আসকার বর্তমানে প্রদর্শিত টুকরোটি চান, যার অর্থ তিনি কোন টুকরোটি প্রদর্শিত হবে তা জানেন না। হ্যাঁ, একাধিক টুকরোগুলি থাকতে পারে তবে প্রশ্নটি অনুমিত করে কেবল 1 টি টুকরোটি ইউআইতে প্রদর্শিত হয় .... দুঃখিত, ডাউনওয়েট করতে হয়েছিল কারণ এটি প্রশ্নের প্রসঙ্গে উত্তর দেয় না।
রাগ করুনআইটিউইজি

410

আমি জানি এটি একটি পুরানো পোস্ট, তবে এটির আগেও সমস্যা ছিল। onBackStackChanged()শ্রবণ ফাংশনে এটি করার জন্য একটি সমাধান খুঁজে পেয়েছেন

  @Override
    public void onBackPressed() {
        super.onBackPressed();

         Fragment f = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
      if(f instanceof CustomFragmentClass) 
        // do something with f
        ((CustomFragmentClass) f).doSomething();

    }

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


13
নেভিগেশন ড্রয়ারের সাথে স্ক্রিন রোটেশনের পরে অনব্যাকপ্রেসড () এর সাথে ডিল করার সময় ঠিক কী আমি খুঁজছিলাম। এটি ভাগ করে নেওয়ার জন্য ফিরে আসার জন্য ধন্যবাদ।
শর্টফিউজ

1
অভ্যন্তরীণভাবে সমস্ত টুকরো টুকরো টুকরো টুকরো করে ফ্রেগমেন্টবিড আইডি পুনরাবৃত্তি করে না? :)
অ্যান্ড্রু সেনার

46
ক্ষেত্রে যদি .getFragmentManagerবেমানান ধরনের প্রতিবেদন করা যায়, যেমনটি এটি আমার ক্ষেত্রে ঘটেছিল, কারণ আমি ব্যবহার করছিলাম android.support.app.v4.Fragment, সেই ক্ষেত্রে সঠিক পদ্ধতিটি ব্যবহার করা হয়েছেgetSupportFragmentManager
রেজওয়ান বার্বু

3
অথবা আপনি যদি খণ্ডে যোগ করার সময় ট্যাগ সরবরাহ করে থাকেন তবে আপনি তার findFragmentByTag()জায়গায় ব্যবহার করতে পারেনfindFragmentByIdfragmentManager.beginTransaction() .add(containerID, frag, fragmentTag) .addToBackStack(fragmentTag) .commit();
ডেল্টাপ্যাপ019

@ অ্যান্ড্রুসেনার, তার অর্থ তিনি পরিষ্কারভাবে এটি করতে চাননি :)
ফরিদ

161

এখানে আমার সমাধানটি যা আমি কম খণ্ডিত দৃশ্যের জন্য কার্যকর বলে মনে করি

public Fragment getVisibleFragment(){
    FragmentManager fragmentManager = MainActivity.this.getSupportFragmentManager();
    List<Fragment> fragments = fragmentManager.getFragments();
    if(fragments != null){
        for(Fragment fragment : fragments){
            if(fragment != null && fragment.isVisible())
                return fragment;
        }
    }
    return null;
}

13
fragmentনির্দিষ্ট পরিস্থিতিতে যেমন নথ হতে পারে যেমন আপনি যখন পিছনের স্ট্যাকটি পপ করেন। তাই আরও ভাল ব্যবহার if (fragment != null && fragment.isVisible())
cprcrack

8
পদ্ধতিটি অসম্পূর্ণ কারণ এটি সম্ভব কেবলমাত্র একটি খণ্ড দৃশ্যমান নয়
14

যদি কোনও খণ্ড দৃশ্যমান না হয়, তবে ফ্রেগমেন্ট ম্যানেজ.জেটফ্রেগমেন্টস () এনইউএল ফিরিয়ে দেবে যা এনপিইতে "NULL অবজেক্ট রেফারেন্সে ইন্টারফেস পদ্ধতি 'java.util.Iterator java.util.List.iterator ()' আহ্বান করার চেষ্টা করবে" বলে বলেছে। সুতরাং, লুপটির জন্য একটি সাধারণ চেক দ্বারা ঘিরে রাখা উচিত: যদি (টুকরো! = নাল)
প্রণব মহাজন

একাধিক টুকরো দৃশ্যমান হলে কী হবে?
শিবরাজ পাতিল

5
প্রযুক্তিগতভাবে এটি প্রশ্নের ভিত্তিতে উত্তর হিসাবে চিহ্নিত করা উচিত। প্রশ্নকারী বর্তমানে প্রদর্শিত টুকরা চায়, কোনটি খণ্ড তা জেনে না। অন্যান্য উত্তরগুলি ট্যাগ দ্বারা টুকরো টুকরো টুকরো
টানতে থাকে

76

প্রতিবার খণ্ডগুলি দেখানোর সময় অবশ্যই আপনাকে এটি ব্যাকস্ট্যাকের মধ্যে রেখে দিতে হবে:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_ENTER_MASK);       
ft.add(R.id.primaryLayout, fragment, tag);
ft.addToBackStack(tag);
ft.commit();        

এবং তারপরে আপনার বর্তমান খণ্ডটি পাওয়ার দরকার পরে আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন:

public BaseFragment getActiveFragment() {
    if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
        return null;
    }
    String tag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
    return (BaseFragment) getSupportFragmentManager().findFragmentByTag(tag);
}

4
আমি মোটামুটি নিশ্চিত যে এই কৌশলটি ভিউপ্যাজারের সাথে ব্যবহৃত টুকরোগুলির জন্য কাজ করবে না, কারণ তারা ট্যাগ দ্বারা যুক্ত করা হয়নি। শুধু সেখানে টসিং।
loeschg

3
এটি কেবলমাত্র আপনি কল করার সময় কাজ করবে বলে মনে হচ্ছে addToBackStack(tag), তবে আপনি যদি পিছনের স্ট্যাকটিতে খণ্ড যুক্ত করতে চান না তবে কী হবে?
cprcrack

1
এটি কেবল তখনই কাজ করে যদি আপনার ট্যাগটি ব্যাক স্ট্যাক নামের মতো হয়, যা দেখে মনে হয় এটি অস্বাভাবিক হবে।

আপনি যদি একই লেনদেনে 5 টি টুকরো যোগ করেন তবে কী হবে?
কেভিন লাম

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

23

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

    FragmentManager fragManager = this.getSupportFragmentManager();
    int count = this.getSupportFragmentManager().getBackStackEntryCount();
    Fragment frag = fragManager.getFragments().get(count>0?count-1:count);

3
আপনার অবশ্যই নিশ্চিত গণনা> ০ হওয়া উচিত যাচাই করা উচিত যাতে ফলাফলটি (গণনা -১) কোনও সূচি নিক্ষেপ না করে
E

@ পুনরায় এই অংশটি প্রতিস্থাপন করা হয়েছে কিন্তু ব্যাকস্ট্যাকে যোগ করা হয়নি তা দেবে না? রাইট? যদি হ্যাঁ হয়, তবে আমি ট্যাগ আর্গুমেন্টটি ব্যবহার করে এটি পেতে পারি?
ক্যাফেবাব 1991

আপনি এতে পপব্যাকস্ট্যাক (নাল, ফ্রেগমেন্টম্যানেজার পিওপি_বিএসিপিসিপিএসিপিএনসিপিএলসিএস) কল করার পরে গেটফ্রেগমেন্টস কলটি আপনাকে টুকরো টুকরোটি যুক্ত করার আদেশ দেবে না এবং আরও টুকরো যুক্ত করবে।
লেহো

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

আপনার fragManager.getFragments().size()পরিবর্তে তাদের পরীক্ষা করা উচিত getBackStackEntryCount()যেগুলি অগত্যা সমান নয় (যা আমার ক্ষেত্রে)। অন্যথায় আপনি সূচিপত্র ছাড়িয়ে ক্র্যাশ পেতে পারেন এক্সপেশন
রুস্তমজি

19

কোটলিন উপায়;

val currentFragment = supportFragmentManager.fragments.last()

এপিআই 26 এবং কেবলমাত্র উপর কাজ করে
ইবিট

1
@ কেবলমাত্র এপিআই 26 এবং তার উপরে কাজ করে আপনার অর্থ কী? আমি এমুলেটর এপিআই 19 ভাল কাজ করে চেষ্টা করেছি।
হেন্দ্রডাব্লুডি 22

@ হেন্দ্রডাব্লুডি আপনি ঠিক আছেন! আমি ফ্রেমওয়ার্কের getFragments()ফাংশনে ফাংশনটি উল্লেখ করছিলাম , এটি এপিআই 26 এবং এর বেশি।
ইবিট

2
যত্ন নিবেন. আপনার যদি কোনও খণ্ড স্ট্যাক না থাকে তার আগে এটি খালি ব্যতিক্রম ঘটায়!
জেটউইজ

এই কাজ করে না? java.lang.ClassCastException: androidx.navication.fragment.NavHostFraਮੈਂਟ ভাগে ভাগ করা যায় না
coolcool1994

13

প্রতিক্রিয়াশীল পথ:

Observable.from(getSupportFragmentManager().getFragments())
    .filter(fragment -> fragment.isVisible())
    .subscribe(fragment1 -> {
        // Do something with it
    }, throwable1 -> {
        // 
    });

7
কিভাবে এটি প্রতিক্রিয়াশীল? আপনি একটি পর্যবেক্ষণযোগ্য ব্যবহার করুন তবে এটি কেবল একবারে নির্গত হবে
টিম

6
এবং এটি কেবল একটি ওভারকিল। একটি সাধারণ বর্ধিত অবলম্বনটি একই কাজ করবে, সম্ভবত এটি আরও দ্রুত।
পিটারস্টেভ উরেমেগবা

কেবলমাত্র স্ট্রিম এপিআইয়ের জন্য প্রতিক্রিয়াশীল স্ট্রিম ব্যবহার করা তেমন স্মার্ট নয়, বাস্তবে তারা বলেছিল যে আপনি ওভারকিলটি বাষ্প জাভা 8 এপি ব্যবহার করুন যদি আপনি তালিকাটিকে স্ট্রিম হিসাবে বিবেচনা করতে চান এবং এপিআই ফিল্টার প্রয়োগ করতে চান
AndroidLover

13

আমার পদ্ধতিটি এইভাবে চেষ্টা / ধরার উপর ভিত্তি করে:

MyFragment viewer = null;
    if(getFragmentManager().findFragmentByTag(MY_TAG_FRAGMENT) instanceOf MyFragment){
    viewer = (MyFragment) getFragmentManager().findFragmentByTag(MY_TAG_FRAGMENT);
}

তবে এর থেকে আরও ভাল উপায় হতে পারে ...


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

MY_TAG_FRAGMENT হ'ল প্রতিস্থাপনটি ব্যবহার করার আগে আমি তৈরি করা টুকরোটির ট্যাগ, এর মতো: ফ্রেগমেন্ট ট্রান্সসেকশন.রেপ্লেস (আর। আইডি। এফএল_মাইফ্র্যাগমেন্ট, মাইফ্র্যাগমেন্ট, এমওয়াইটি্যাগ_এফআরএজিএএম);
থর্ডাক্স

আমার যদি একাধিক টুকরা থাকে, তখন .replace (...) কল করার সময় আমি কি সমস্ত টুকরাগুলির জন্য একটি ট্যাগ ব্যবহার করতে পারি?
লীম.ফিন

হ্যাঁ, কোনও সমস্যা নেই, এই কোডটি ব্যবহার করুন: ফ্রেগমেন্ট ট্রান্সজেকশন.রেপ্লেস (আর.আইডি.এফএল_মাইফ্রেগমেন্ট, মাইফ্র্যাগমেন্ট, এমওয়াইটিএজিএজি_এফআরএজিএএমএটি); এবং এটি ভাল যেতে পারে।
থর্ডাক্স

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

11

ঠিক আছে, এই প্রশ্নটি প্রচুর মতামত এবং মনোযোগ পেয়েছে তবে এখনও getFrations () ব্যবহার করার জন্য - আমার শেষ থেকে সবচেয়ে সহজ সমাধানটি ধারণ করে নি।

            List fragments = getSupportFragmentManager().getFragments();
            mCurrentFragment = fragments.get(fragments.size() - 1);

1
দুর্ভাগ্যক্রমে, এটি সর্বদা সত্য নয়, getSupportFragmentManager().getFragments() সর্বশেষ তালিকাটি ব্যাকস্ট্যাক থেকে সজ্জিত করা হলে এটি আপনাকে তালিকার পিছনে ফিরিয়ে দেয় তবে এটি নাল মান রাখতে পারে। Eq: আপনি যদি onBackStackChanged()পদ্ধতিটির ভিতরে যেতে চান এবং আপনি popBackStack()কোথাও কল করেন তবে তা mCurrentFragmentহবে null
স্টুমি

@ স্টুমি এই তথ্যের জন্য ধন্যবাদ। হ্যাঁ, অ্যান্ড্রয়েডে অনেকগুলি অদ্ভুত জীবনচক্র সমস্যার মতো শোনাচ্ছে।
নাটিভ

9

আপনার ক্রিয়াকলাপ সামগ্রী ফ্রেমে কোন টুকরোটি লোড করা হয়েছে তা আপনি জিজ্ঞাসা করতে পারেন এবং খণ্ড শ্রেণি বা খণ্ডের 'সরল নাম' (একটি স্ট্রিং হিসাবে) পুনরুদ্ধার করতে পারেন।

public String getCurrentFragment(){
     return activity.getSupportFragmentManager().findFragmentById(R.id.content_frame).getClass().getSimpleName();
}

ব্যবহার:

Log.d(TAG, getCurrentFragment());

আউটপুট:

D/MainActivity: FragOne

8

এটি কিছুটা দেরী হয়ে গেছে, তবে যে আগ্রহী তার জন্য: আপনি যদি ফ্র্যাগমেন্টম্যানেজারে আপনার পছন্দসই খণ্ডটির সূচকটি জানেন তবে কেবল এটির একটি রেফারেন্স পান এবং ইসমেনুভিজিবল () ফাংশনটি পরীক্ষা করে দেখুন! এখানে :

getSupportFragmentManager().getFragments().get(0).isMenuVisible()

যদি trueএটি ব্যবহারকারীর কাছে দৃশ্যমান হয় এবং ততক্ষণ!


1
আশ্চর্যজনকভাবে যথেষ্ট, এটি এখানে তালিকাভুক্ত একমাত্র সমাধান যা আমার জন্য কাজ করেছিল। একই সময়ে, একাধিক টুকরা থাকতে পারে isVisible() == true, getView() != null। এছাড়াও, আমার কোডটি getBackStackEntryCountসর্বদা শূন্য। যদিও আমি মেনু ব্যবহার করি না, isMenuVisible()এখন পর্যন্ত কেবলমাত্র বৈষম্যই মনে হয় যে এটি বর্তমানে 'সক্রিয়' খণ্ডটির জন্য নির্ভরযোগ্যভাবে নির্দেশ করে। ty
parvus

7

1)

ft.replace(R.id.content_frame, fragment, **tag**).commit();

2)

FragmentManager fragmentManager = getSupportFragmentManager();
Fragment currentFragment = fragmentManager.findFragmentById(R.id.content_frame);

3)

if (currentFragment.getTag().equals(**"Fragment_Main"**))
{
 //Do something
}
else
if (currentFragment.getTag().equals(**"Fragment_DM"**))
{
//Do something
}

6

যদি এখানে পৌঁছে যান এবং আপনি কোটলিন ব্যবহার করছেন :

var fragment = supportFragmentManager.findFragmentById(R.id.fragment_container)

R.id.fragment_containerহয় idযেখানে fragmentউপর উপস্থাপন করছে তাদেরactivity

অথবা আপনি যদি একটি ভাল সমাধান চান:

supportFragmentManager.findFragmentById(R.id.content_main)?.let {
    // the fragment exists

    if (it is FooFragment) {
        // The presented fragment is FooFragment type
    }
}

5

টেনির উত্তর থেকে অনুপ্রাণিত , আমার দুটি সেন্ট এখানে। অন্যান্য অন্যান্য বাস্তবায়ন থেকে সামান্য পরিবর্তিত।

private Fragment getCurrentFragment() {
    FragmentManager fragmentManager = myActivity.getSupportFragmentManager();
    int stackCount = fragmentManager.getBackStackEntryCount();
    if( fragmentManager.getFragments() != null ) return fragmentManager.getFragments().get( stackCount > 0 ? stackCount-1 : stackCount );
    else return null;
}

"myActivity"যদি এটি আপনার বর্তমান ক্রিয়াকলাপ হয় বা আপনার ক্রিয়াকলাপের রেফারেন্স ব্যবহার করে তবে "এটি" দিয়ে প্রতিস্থাপন করুন ।


5

এখানে একটি পদ্ধতি বলা findFragmentById()হয়েছে SupportFragmentManager। আমি এটিকে ক্রিয়াকলাপের পাতায় যেমন ব্যবহার করি:

public Fragment currentFragment(){
    return getSupportFragmentManager().findFragmentById(R.id.activity_newsfeed_frame);
}

আপনার বর্তমান পেতে কিভাবে এই Fragment। আপনার যদি কাস্টম থাকে Fragmentএবং Fragmentএটি কী তা যাচাই করা দরকার হলে আমি সাধারণত instanceof:

if (currentFragment() instanceof MyFrag){
    // Do something here
}

5

আপনি যদি ব্যবহার করছেন AndroidX Navigation:

val currentFragment = findNavController(R.id.your_navhost).?currentDestination

এই নেভিগেশন উপাদানটি সম্পর্কে আরও তথ্যের জন্য: https://developer.android.com/guide/navication/navication-getting-st সূত্র


এটি সংকলন করে না
ইগোরগানপলস্কি

1
এটি কেবল তখনই সংকলন করতে পারে যদি আপনি অ্যান্ড্রয়েডএক্স নেভিগেশন সঠিকভাবে সেটআপ করে থাকেন এবং কোনওভাবে আপনার নাভহস্তকে কল করেছেন your_navhost
কোরি রায়

4

এটি বর্তমান খণ্ডটি পাওয়ার সহজ উপায় ..

getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
  @Override public void onBackStackChanged() {
    currentFragment = fragmentManager.findFragmentById(R.id.content);
    if (currentFragment !=  null && (currentFragment instanceof LoginScreenFragment)) {
      logout.setVisibility(View.GONE);
    } else {
      logout.setVisibility(View.VISIBLE);
    }
  }
});

4

সেভ এর উত্তর যখন আপনি পিছনে বোতামটি চাপান বা অন্যথায় ব্যাকস্ট্যাকটি পরিবর্তন করেন তখন তার জন্য কাজ করে।

যদিও আমি কিছুটা আলাদা করেছি। আমার বেস ফ্রেমেমেন্ট এবং এর উত্পন্ন টুকরাগুলির পিছনে একটি ব্যাকস্ট্যাক পরিবর্তন শ্রোতার সেটআপ রয়েছে এবং শ্রোতার মধ্যে এই কোডটি রয়েছে:

Fragment f = getActivity().getSupportFragmentManager().findFragmentById(R.id.container);

if (f.getClass().equals(getClass())) {
    // On back button, or popBackStack(),
    // the fragment that's becoming visible executes here,
    // but not the one being popped, or others on the back stack

    // So, for my case, I can change action bar bg color per fragment
}

3

এটা আমার জন্য কাজ। আমি আশা করি এটি কাউকে হেপ করবে।

FragmentManager fragmentManager = this.getSupportFragmentManager();  
        String tag = fragmentManager
                    .getBackStackEntryAt(
                    fragmentManager
                    .getBackStackEntryCount() - 1)
                    .getName();
              Log.d("This is your Top Fragment name: ", ""+tag);

3

আপনি যদি পিতামাতার ক্রিয়াকলাপ থেকে খণ্ডনের বর্তমান উদাহরণটি পান তবে আপনি এটি করতে পারেন

findFragmentByID(R.id.container);

এটি বাস্তবে দেখা যায় এমন খণ্ডগুলির বর্তমান উদাহরণটি পেয়েছে pop আমারও একই প্রশ্ন ছিল. আমাকে একই টুকরোটি দু'বার ব্যাকস্টকে রেখে লোড করতে হয়েছিল।

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

findFragmentByTag()

3

এই সমাধানটি চেকআউট করুন। এটি বর্তমান খণ্ডটি পাওয়ার জন্য আমার পক্ষে কাজ করেছিল।

if(getSupportFragmentManager().getBackStackEntryCount() > 0){
        android.support.v4.app.Fragment f = 
         getSupportFragmentManager().findFragmentById(R.id.fragment_container);
        if(f instanceof ProfileFragment){
            Log.d(TAG, "Profile Fragment");
        }else if(f instanceof SavedLocationsFragment){
            Log.d(TAG, "SavedLocations Fragment");
        }else if(f instanceof AddLocationFragment){
            Log.d(TAG, "Add Locations Fragment");
        }

2
final FragmentManager fm=this.getSupportFragmentManager();
final Fragment fragment=fm.findFragmentByTag("MY_FRAGMENT");

if(fragment != null && fragment.isVisible()){
      Log.i("TAG","my fragment is visible");
}
else{
      Log.i("TAG","my fragment is not visible");
}

এটি জেটপ্যাকের সাথে কাজ করে?
ইগোরগানাপলস্কি

2
getSupportFragmentManager().findFragmentById(R.id.content_frame).getClass().getSimpleName();

ভাল, আমি অনুমান করি যে এটি এই প্রশ্নের সর্বাধিক সরাসরি উত্তর। আশা করি এটা কাজে লাগবে.


2

এখানে একটি কোটলিন সমাধান:

if ( this.getSupportFragmentManager().getBackStackEntryCount()>0 ) {
    var fgmt = this.getSupportFragmentManager().fragments[this.getSupportFragmentManager().getBackStackEntryCount()-1]
    if( fgmt is FgmtClassName ) {
        (fgmt as FgmtClassName).doSth()
    }
}

সরলীকৃত উপায়:

with ( this.getSupportFragmentManager() ) {
    if ( getBackStackEntryCount()>0 ) {
        var fgmt = fragments[getBackStackEntryCount()-1]
        if ( fgmt is FgmtClassName ) {
            (fgmt as FgmtClassName).doSth()
        }
    }
}

2

এটি করার সহজ উপায়:

Fragment fr=getSupportFragmentManager().findFragmentById(R.id.fragment_container);
String fragmentName = fr.getClass().getSimpleName();

1

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


এত কাছে! :-)
ব্লুন্ডেল

আমরা জেটপ্যাক নেভিগেশন লাইব্রেরিটি ব্যবহার করি
ইগোরগানাপলস্কি

1

স্ক্রোলড টুকরাগুলির ক্ষেত্রে, যখন ভিউপেজার ক্লাসের আপনার ব্যবহারের উদাহরণটি ধরা যাক, এমভিউপেইজার, আপনি বর্তমান খণ্ড খণ্ড নম্বর পাওয়ার জন্য mViewPager.getCurrentItem () কল করতে পারেন।

মেইনলাইআউট.এক্সএমএল এ

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical"
    tools:context="unidesign.photo360.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="false"
        android:theme="@style/AppTheme.AppBarOverlay"
        app:expanded="false">

        <android.support.v7.widget.Toolbar
            android:id="@+id/main_activity_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            app:title="@string/app_name">

        </android.support.v7.widget.Toolbar>

    </android.support.design.widget.AppBarLayout>


    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </android.support.v4.view.ViewPager>
    
</android.support.design.widget.CoordinatorLayout>

মেইনএকটিভিটি.কিটি

class MainActivity : AppCompatActivity() {
    
        lateinit var mViewPager: ViewPager
        lateinit var pageAdapter: PageAdapter
        
//      ...
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            
            pageAdapter = PageAdapter(supportFragmentManager)
            mViewPager = findViewById(R.id.view_pager)
//          ...
            }
            
        override fun onResume() {
          super.onResume()
          var currentFragment = pageAdapter.getItem(mViewPager.currentItem)
//         ...
          }


1

আমি খুঁজে পেয়েছি findFragmentByTagযে সুবিধাজনক নয়। আপনি যদি String currentFragmentTagআপনার Activityবা অভিভাবক Fragment, আপনি এটা সংরক্ষণ করতে হবে onSaveInstanceStateএবং এটি পুনরুদ্ধার onCreate। এমনকি যদি আপনি তা করেন, যখন Activityrecreated, onAttachFragmentআগে ফোন দিয়েছিলাম হবে onCreate, তাই আপনি ব্যবহার করতে পারবেন না currentFragmentTagonAttachFragment(যেমন। উপর ভিত্তি করে কিছু মতামত আপডেটcurrentFragmentTag করা হয়েছে কারণ এটি ইযযতের এখনো পুনরুদ্ধার করা)।

আমি নিম্নলিখিত কোড ব্যবহার করি:

Fragment getCurrentFragment() {
    List<Fragment> fragments = getSupportFragmentManager().getFragments();
    if(fragments.isEmpty()) {
        return null;
    }
    return fragments.get(fragments.size()-1);
}

দস্তাবেজ FragmentManagerযে রাষ্ট্র

তালিকার খণ্ডগুলির ক্রম হ'ল ক্রমটি সেগুলিতে যুক্ত বা সংযুক্ত ছিল।

যখন আপনাকে বর্তমান খণ্ডের প্রকারের ভিত্তিতে স্টাফগুলি করতে getCurrentFragment() instance of MyFragmentহবে তখন কেবল তার পরিবর্তে ব্যবহার করুন currentFragmentTag.equals("my_fragment_tag")

লক্ষ্য করুন getCurrentFragment()যে onAttachFragmentসংযোজনের পাবেন না Fragment, কিন্তু পূর্ববর্তী সংযুক্ত করুন।


1

আমাকে খুব সম্প্রতি এটি করতে হয়েছিল এবং এখানে উত্তরগুলির কোনওটিরই এই দৃশ্যের পক্ষে উপযুক্ত নয়।

আপনি যদি নিশ্চিত হন যে কেবলমাত্র একটি টুকরো দৃশ্যমান হবে (পূর্ণ-স্ক্রিন), তাই ব্যাকস্ট্যাকের শীর্ষে কী আছে তা সত্যিই খুঁজে পেতে চাই want উদাহরণস্বরূপ, একটি Kotlinজন্য Fragment:

import androidx.fragment.app.Fragment

fun Fragment.setVisibilityChangeListener(clazz: Class<out Fragment>, listener: (Boolean) -> Unit) {
    fragmentManager?.run {
        addOnBackStackChangedListener {
            val topFragmentTag = getBackStackEntryAt(backStackEntryCount - 1).name
            val topFragment = findFragmentByTag(topFragmentTag)
            listener(topFragment != null && topFragment::class.java == clazz)
        }
    }
}

এবং এটি ব্যবহার করুন:

class MyFragment: Fragment {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        setVisibilityChangeListener(this::class.java) { visible -> 
            // Do stuff
        }
    }
}

1

আপনি লগক্যাটটিতে এমন একটি URL দিয়ে খুব সহজেই এটি করতে পারেন যা আপনাকে বর্তমান খণ্ডের উত্স কোডের উত্স কোডে পুনর্নির্দেশ করবে। প্রথমে আপনাকে হোস্ট ক্রিয়াকলাপে একটি অনব্যাকস্ট্যাক চ্যাঞ্জডলিস্টনার যুক্ত করতে হবে যেমন -

activity.getChildFragmentManager().addOnBackStackChangedListener(backStackListener);

এবং অনব্যাকস্ট্যাক চ্যাঞ্জডলিস্টনার বাস্তবায়ন হ'ল -

    public FragmentManager.OnBackStackChangedListener backStackListener = () -> {

    String simpleName = "";
    String stackName = getStackTopName().trim();

    if (Validator.isValid(stackName) && stackName.length() > 0) {

      simpleName = stackName.substring(Objects.requireNonNull(stackName).lastIndexOf('.') + 1).trim();

      List<Fragment >
       fragmentList = getChildFragmentManager().getFragments();
      Fragment myCurrentFragment;

      for (int i = 0; i < fragmentList.size(); i++) {
       myCurrentFragment= fragmentList.get(i);
       if (myCurrentFragment.getClass().getSimpleName().equals(simpleName)) {
        //Now you get the current displaying fragment assigned in myCurrentFragment.
        break;
       }
       myFragment = null;
      }
     }


     //The code below is for the source code redirectable logcat which would be optional for you.
     StackTraceElement stackTraceElement = new StackTraceElement(simpleName, "", simpleName + ".java", 50);
     String fileName = stackTraceElement.getFileName();
     if (fileName == null) fileName = "";
     final String info = "Current Fragment is:" + "(" + fileName + ":" +
     stackTraceElement.getLineNumber() + ")";
     Log.d("now", info + "\n\n");
    };

এবং getStackTopName () পদ্ধতিটি হ'ল -

public String getStackTopName() {
    FragmentManager.BackStackEntry backEntry = null;
    FragmentManager fragmentManager = getChildFragmentManager();
    if (fragmentManager != null) {
        if (getChildFragmentManager().getBackStackEntryCount() > 0)
            backEntry = getChildFragmentManager().getBackStackEntryAt(
                    getChildFragmentManager().getBackStackEntryCount() - 1
            );
    }
    return backEntry != null ? backEntry.getName() : null;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.