অ্যান্ড্রয়েড নেভিগেশন আর্কিটেকচার উপাদান - বর্তমান দৃশ্যমান খণ্ড পান


95

নেভিগেশন উপাদানটি চেষ্টা করার আগে আমি নিজে খণ্ডিত লেনদেন করতাম এবং বর্তমান খণ্ডটি আনতে ফ্রেগ ট্যাগ ব্যবহার করতাম।

val fragment:MyFragment = supportFragmentManager.findFragmentByTag(tag):MyFragment

এখন আমার মূল ক্রিয়াকলাপের বিন্যাসে আমার কাছে এমন কিছু রয়েছে:

<fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/nav_host"
        app:navGraph= "@navigation/nav_item"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost= "true"
        />

আমি কীভাবে নেভিগেশন উপাদান দ্বারা বর্তমান প্রদর্শিত টুকরা পুনরুদ্ধার করতে পারি? করছে

supportFragmentManager.findFragmentById(R.id.nav_host)

একটি প্রদান করে NavHostFragmentএবং আমি আমার প্রদর্শিত 'মাইফ্রেগমেন্ট'টি পুনরুদ্ধার করতে চাই `

ধন্যবাদ.


4
বর্তমান টুকরা স্ট্যাকওভারফ্লো.com/a/50689587/1268507 পুনরুদ্ধার করার কোনও উপায় নেই আপনি কী অর্জন করার চেষ্টা করছেন? সম্ভবত এটির জন্য আরও কিছু সমাধান রয়েছে।
অ্যালেক্স

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

আপনি কি সেই খণ্ডটি অবজেক্টে কোনও ক্রিয়াকলাপ করতে চান? বা শুধু আপনি চান কোন খণ্ড দেখানো হয়?
রঞ্জন

উত্তর:


101

আমি আপাতত একটি উপায় আবিষ্কার করতে সক্ষম হয়েছি এবং এটি নিম্নরূপ:

NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host);
navHostFragment.getChildFragmentManager().getFragments().get(0);

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


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

এই বাগ প্রতিবেদনে ইস্যু করাতে ইস্যু করা হয়েছে: ইস্যুটিয়রেকার.কম.স.ইউ.স. / ১১৯৮০০৮৮ এটি করা সঠিক পদ্ধতি নয়। সঠিক উত্তর পরিবর্তন বিবেচনা করুন!
নিকোলাস পাইত্রি

4
যেমনটি উল্লেখ করা হয়েছে, এটি সমাধান নয়, যথাযথ সমাধান না পাওয়া পর্যন্ত এটি কার্যনির্বাহী।
আন্দ্রে টোডার

4
এটি অনেক ধন্যবাদ। আমি বাগ ট্র্যাকারে প্রস্তাবিত হিসাবে প্রাইমারিনাভিগেশন ফ্রেমমেন্ট () চেষ্টা করেছি কিন্তু এটি কাজটি করে না।
জেরি হু

4
এই সমাধানের ভিত্তিতে আমি একটি কোটলিন ফাংশন তৈরি করেছি যা বর্তমান খণ্ডটি নির্দিষ্ট ধরণের (আইডির পরিবর্তে) কিনা তা পরীক্ষা করতে পারে: navHostFragment!!.childFragmentManager.fragments.any { it.javaClass == fragmentClass && it.isVisible }বেশ অনুরূপভাবে কাজ করে। আশা করি এটি কারও সাহায্য করবে!
পি কুয়েজ্পাররা

49

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

navController.currentDestination?.getId()

এটি নেভিগেশন ফাইলে আইডি ফিরিয়ে দেয়। আশাকরি এটা সাহায্য করবে.


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

7
আমি প্রত্যাশা করেছি যে ফিরে আসা আইডিটি এনএভি এক্সএমএলে আইডিটির সাথে মেলে তবে এটি হয় না, সুতরাং অন্য কথায় আপনি নাভ্যাক্ট্রোলআরজেটকন্টারডেস্টেশন () পরীক্ষা করতে পারবেন না। getId () == আর.আইডি.মিফ্রেগ
লেরেস অলডটাই

4
@ লেরেস অলডটাই এটি নেভিগেশন ফাইলের খণ্ডের আইডিটির সাথে মেলে।
slhddn

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

31

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

val navHost = supportFragmentManager.findFragmentById(R.id.main_nav_fragment)
    navHost?.let { navFragment ->
        navFragment.childFragmentManager.primaryNavigationFragment?.let {fragment->
                //DO YOUR STUFF
        }
    }
}

4
এই পদ্ধতি এখন fragmentManager মধ্যে নথিভুক্ত করা issuetracker.google.com/issues/119800853
নিকোলাস Pietri

এটি একটি সমস্যা মনে হয়। নেভিগেশন হ্যান্ডলিং আপ করতে আমাকে সমর্থনপুরাইগেটআপ ()
ফিলিটি_উইজার্ড

18

এটি পরিষ্কার সমাধান মত মনে হচ্ছে। আপডেট: সম্পত্তিতে এক্সটেনশন ফাংশন পরিবর্তিত হয়েছে। ধন্যবাদ ইগর Wojda

1. নিম্নলিখিত এক্সটেনশন তৈরি করুন

import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager

val FragmentManager.currentNavigationFragment: Fragment?
    get() = primaryNavigationFragment?.childFragmentManager?.fragments?.first()

2. ইন Activityসঙ্গে NavHostFragmentএর মতো এটিকে ব্যবহার:

val currentFragment = supportFragmentManager.currentNavigationFragment

4
সুন্দর - FragmentManager.currentNavigationFragment
এটির মধ্যে

16

addOnDestinationChangedListenerথাকার ক্রিয়াকলাপে ব্যবহার করুনNavHostFragment

জাভা জন্য

 NavController navController= Navigation.findNavController(MainActivity.this,R.id.your_nav_host);

        navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
            @Override
            public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
                Log.e(TAG, "onDestinationChanged: "+destination.getLabel());
            }
        });

কোটলিনের জন্য

var navController :NavController=Navigation.findNavController(this, R.id.nav_host_fragment)
    navController.addOnDestinationChangedListener { controller, destination, arguments ->
        Log.e(TAG, "onDestinationChanged: "+destination.label);

    }

8

এটি দেরীতে হতে পারে তবে যে কেউ এখনও খুঁজছেন for

val currentFragment = NavHostFragment.findNavController(nav_host_fragment).currentDestination?.id

তাহলে আপনি যেমন কিছু করতে পারেন

if(currentFragment == R.id.myFragment){
     //do something
}

মনে রাখবেন যে এটি কোটলিনের জন্য, জাভা কোড প্রায় একই রকম হওয়া উচিত



5
navController().currentDestination?.id

আপনাকে আপনার বর্তমানের Fragmentআইডি কোথায় দেবে

private fun navController() = Navigation.findNavController(this, R.id.navHostFragment)

এই আইডিটি হ'ল আইডি যা আপনি আপনার Navigation Graph XMLফাইলে fragmentট্যাগের আওতায় দিয়েছেন । আপনি চাইলে তুলনাও currentDestination.labelকরতে পারেন।


4

কাজের সমাধান খুঁজে পেয়েছি।

private fun getCurrentFragment(): Fragment? {
    val currentNavHost = supportFragmentManager.findFragmentById(R.id.nav_host_id)
    val currentFragmentClassName = ((this as NavHost).navController.currentDestination as FragmentNavigator.Destination).className
    return currentNavHost?.childFragmentManager?.fragments?.filterNotNull()?.find {
        it.javaClass.name == currentFragmentClassName
    }
}

3

যে ক্রিয়াকলাপটি ব্যবহার করে তা থেকে NavHostFragment, নীচের কোডটি ব্যবহার করে এর উদাহরণটি পুনরুদ্ধার করতে পারেন Active Fragment

val fragmentInstance = myNavHostFragment?.childFragmentManager?.primaryNavigationFragment

3

আমার প্রয়োজন হ'ল প্যারেন্ট ক্রিয়াকলাপ থেকে বর্তমান দৃশ্যমান খণ্ডটি পাওয়া আমার সমাধানটি

 private LoginFragment getCurrentVisibleFragment() {
        NavHostFragment navHostFragment = (NavHostFragment)getSupportFragmentManager().getPrimaryNavigationFragment();
        FragmentManager fragmentManager = navHostFragment.getChildFragmentManager();
        Fragment loginFragment = fragmentManager.getPrimaryNavigationFragment();
        if(loginFragment instanceof LoginFragment){
            return (LoginFragment)loginFragment;
        }
        return null;
    }

এটি একই সমস্যাযুক্ত কাউকে সাহায্য করতে পারে।


কোটলিন ল্যাং পেয়েছে?
ইগোরগানাপলস্কি

4
এটি আমার পক্ষে নিখুঁতভাবে কাজ করে, অন্যান্য উত্তরগুলির কী হবে তা নিশ্চিত নন? সম্ভবত এটি আগে কাজ করে না তবে এটি এখন কবজির মতো কাজ করে।
22:25

2

@ এসএলএইচডিএন উত্তর অনুসারে উত্তর এবং মন্তব্য করুন আমি এটি কীভাবে ব্যবহার করছি এবং নাভি_গ্রাফিক.এক্সএমএল ফাইল থেকে খণ্ড আইডিটি উদ্ধার করছি :

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    setSupportActionBar(findViewById(R.id.toolbar))

    val navController = findNavController(this, R.id.nav_host_fragment)

    ivSettingsCog.setOnClickListener {

        if (navController.currentDestination?.id == R.id.updatesFragment) // Id as per set up on nav_graph.xml file
        {
            navController.navigate(R.id.action_updatesFragment_to_settingsFragment)
        }

    }

}

}

1

আপনি দয়া করে getChildFragmentManager()কল সঙ্গে পরীক্ষা করতে পারেন

NavHostFragment fragment = supportFragmentManager.findFragmentById(R.id.nav_host);
MyFragment frag = (MyFragment) fragment.getChildFragmentManager().findFragmentByTag(tag);

1

তৈরি করুন:

Fra আপনার খণ্ডের কয়েকটি বোতামে:

val navController = findNavController(this)
  navController.popBackStack()

Ackব্যাকপ্রেসডে আপনার ক্রিয়াকলাপে ()

override fun onBackPressed() {
        val navController = findNavController(R.id.nav_host_fragment)
        val id = navController.currentDestination?.getId()
        if (id == R.id.detailMovieFragment){
            navController.popBackStack()
            return
        }

        super.onBackPressed()
    } 

1

আপনার যদি আপনার খণ্ডের উদাহরণ প্রয়োজন হয় তবে আপনি সাথে যেতে পারেন:

(ক্রিয়াকলাপ) => supportFragmentManager.fragments.first().childFragmentManager.fragments.first()

এটি খুব কুরুচিপূর্ণ তবে সেখান থেকে আপনি এটি পরীক্ষা করে দেখতে পারেন এটি যে খণ্ডটির সাথে আপনি চারপাশে খেলতে চান তার কোনও উদাহরণ


1

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

public Fragment getFunctionalFragment (String tag_name)
{
    NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
    FragmentManager navHostManager = Objects.requireNonNull(navHostFragment).getChildFragmentManager();

    Fragment fragment=null;
    List fragment_list = navHostManager.getFragments();

    for (int i=0; i < fragment_list.size() ; i ++ )
    {
        if ( fragment_list.get(i) instanceof HomeFragment && tag_name.equals("frg_home")) {
            fragment = (HomeFragment) fragment_list.get(i);
            break;
        }
    }

    return fragment;
}

4
তাই আপনাকে স্বাগতম! দয়া করে আপনার উত্তর পোস্ট করার আগে এটি পরীক্ষা করে দেখুন ... কোডটি পরিষ্কার নয়। আরেকটি সমস্যা: যদি আপনি কেবল কোড আনয়ন করেন তবে 16 টি উত্তর থাকা সত্ত্বেও আপনার সমাধানটি কিছুটা ব্যাখ্যা করুন, যাতে আপনার উত্তরের পেশাদারদের ব্যাখ্যা করা উচিত।
ডেভিড গার্সিয়া বোদেগো

1

নাভস্ট ফ্রেমে প্রথম খণ্ডটি হ'ল বর্তমান খণ্ড

Fragment navHostFragment = getSupportFragmentManager().getPrimaryNavigationFragment();
if (navHostFragment != null) 
{Fragment fragment = navHostFragment.getChildFragmentManager().getFragments().get(0);}

আপনি নিজের উত্তরটি আরও কিছুটা ব্যাখ্যা করতে পারবেন? আপনার কোড ব্যাখ্যা করে।
বিশ

কোড-কেবল উত্তরগুলি নিরুৎসাহিত করা হয়। আপনার উত্তর কেন এবং কীভাবে সমস্যার সমাধান করে তা দয়া করে একটি ব্যাখ্যা সরবরাহ করুন।
ইগোর এফ।

1

প্রথমে আপনি আইডি দ্বারা বর্তমান খণ্ডটি পাবেন, তারপরে আপনি সেই আইডির উপর নির্ভর করে খণ্ডটি খুঁজে পেতে পারেন।

int id = navController.getCurrentDestination().getId();
Fragment fragment = getSupportFragmentManager().findFragmentById(id);

0

আমি আন্দ্রে টয়েডার্স উত্তর এবং মুকুল ভরদ্বাজ উত্তর একটি সাথে সংযুক্ত করেছি OnBackStackChangedListener

একটি বৈশিষ্ট্য হিসাবে:

private FooFragment fragment;

আমার মধ্যে onCreate

NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host);
FragmentManager navHostManager = Objects.requireNonNull(navHostFragment).getChildFragmentManager();
FragmentManager.OnBackStackChangedListener listener = () -> {
        List<Fragment> frags = navHostManager.getFragments();
        if(!frags.isEmpty()) {
            fragment = (FooFragment) frags.get(0);
        }
};
navController.addOnDestinationChangedListener((controller, destination, arguments) -> {
        if(destination.getId()==R.id.FooFragment){
            navHostManager.addOnBackStackChangedListener(listener);
        } else {
            navHostManager.removeOnBackStackChangedListener(listener);
           fragment = null;
        }
});

এইভাবে আমি একটি খণ্ড পেতে পারি, যা পরে প্রদর্শিত হবে। কেউ এমনকি লুপ করতে সক্ষম হতে পারে fragsএবং এর সাথে একাধিক টুকরো পরীক্ষা করতে পারে instanceof


0

নীচে নেভিগেশন ভিউ সেটআপ করতে আমার এটি করা দরকার এবং আমি এটি এইভাবে করেছি:

val navController = Navigation.findNavController(requireActivity(), R.id.nav_tabs_home)
        val bottomNavBar: BottomNavigationView = nav_content_view
        NavigationUI.setupWithNavController(bottomNavBar, navController)

0

এটি অর্জনের সর্বোত্তম উপায় হ'ল একটি খণ্ড জীবনচক্র কলব্যাক নিবন্ধন করা ।

মূল প্রশ্ন অনুসারে, যদি আপনার NavHostFragmentহিসাবে সংজ্ঞায়িত করা হয় ...

<fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/nav_host"
        app:navGraph= "@navigation/nav_item"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost= "true"
        />

তারপরে আপনার মূল ক্রিয়াকলাপে onCreate(..)...

nav_host.childFragmentManager.registerFragmentLifecycleCallbacks(
    object:FragmentManager.FragmentLifecycleCallbacks() {
        override fun onFragmentViewCreated(
            fm: FragmentManager, f: Fragment, v: View,
            savedInstanceState: Bundle?
        ) {
            // callback method always called whenever a
            // fragment is added, or, a back-press returns
            // to the start-destination
        }
    }
)

অন্যান্য কলব্যাক পদ্ধতিগুলি আপনার প্রয়োজনীয়তার সাথে মাপসই করা হবে may


0

এই সমাধানটি বেশিরভাগ পরিস্থিতিতে কাজ করবে এটি চেষ্টা করে দেখুন:

val mainFragment = fragmentManager?.primaryNavigationFragment?.parentFragment?.parentFragment as MainFragment

অথবা এটা:

val mainFragment = fragmentManager?.primaryNavigationFragment?.parentFragment as MainFragment

0

এই কোডটি আমার কাছ থেকে কাজ করে

NavDestination current = NavHostFragment.findNavController(getSupportFragmentManager().getPrimaryNavigationFragment().getFragmentManager().getFragments().get(0)).getCurrentDestination();

switch (current.getId()) {
    case R.id.navigation_saved:
        // WRITE CODE
        break;
}

0

এটি আমার পক্ষে কাজ করে

(navController.currentDestination as FragmentNavigator.Destination).className 

এটি canonicalNameআপনার খণ্ডটি ফিরে আসবে


এটি প্রতিবিম্বের মতো দেখাচ্ছে
ইগোরগানাপলস্কি

0

এটি দেরিতে হতে পারে তবে পরে কাউকে সহায়তা করতে পারে।

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

val nav = Navigation.findNavController(requireActivity(), R.id.fragment_nav_host).currentDestination

এবং এটি টুকরো টুকরো টুকরো টুকরোগুলি

<fragment
    android:id="@+id/sampleFragment"
    android:name="com.app.sample.SampleFragment"
    android:label="SampleFragment"
    tools:layout="@layout/fragment_sample" />

এবং আপনি যেমন প্রয়োজন তা যাচাই করতে পারেন

if (nav.id == R.id.sampleFragment || nav.label == "SampleFragment"){}

0

অবশেষে আপনারা যারা এখনও অনুসন্ধান করছেন তাদের জন্য কার্যকর সমাধানটি আসলে এটি খুব সহজ এবং আপনি কলব্যাক ব্যবহার করে এটি অর্জন করতে পারেন।

এই পদক্ষেপগুলি অনুসরণ করুন:

  1. ক্র্যাকেট () এর ক্রিয়াকলাপ থেকে উদাহরণটি পেতে চাইলে খণ্ডের ভিতরে শ্রোতা তৈরি করুন

    public class HomeFragment extends Fragment {
    
    private OnCreateFragment createLIstener;
    
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        createLIstener.onFragmentCreated(this);
        View root = inflater.inflate(R.layout.fragment_home, container, false);
        //findViews(root);
        return root;
    }
    
    @Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.menu_main, menu);
    
    }
    
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if (item.getItemId()==R.id.action_show_filter){
            //do something
        }
        return super.onOptionsItemSelected(item);
    }
    
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {
            createLIstener = (OnCreateFragment) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + " must implement OnArticleSelectedListener");
            }
        }
    
        public interface OnCreateFragment{
            void onFragmentCreated(Fragment f);
        }
    }
    
  2. হোস্ট ফ্র্যাগমেন্ট / ক্রিয়াকলাপে আপনার শ্রোতার প্রয়োগ করুন

    public class MainActivity extends AppCompatActivity implements HomeFragment.OnCreateFragment {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            BottomNavigationView navView = findViewById(R.id.nav_view);
           // Passing each menu ID as a set of Ids because each
           // menu should be considered as top level destinations.
            AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
                    R.id.navigation_home,
                    R. ----)
            .build();
            NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
            NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
            NavigationUI.setupWithNavController(navView, navController);
        }
    
        @Override
        public void onFragmentCreated(Fragment f) {
            if (f!=null){
                H.debug("fragment created listener: "+f.getId());
                f.setHasOptionsMenu(true);
            }else {
                H.debug("fragment created listener: NULL");
            }
        }
    }
    

এবং এই কাজটি আপনার করা দরকার। এই সাহায্য কাউকে


0

1 টি টুকরা, কোটলিন, নেভিগেশন ব্যবহারের সাথে আমি সবচেয়ে ভাল উপায়টি বের করতে পারি:

আপনার লেআউট ফাইলটিতে ট্যাগটি যুক্ত করুন: "অ্যান্ড্রয়েড: ট্যাগ =" প্রধান_ফরাগমেন্ট_ট্যাগ ""

<fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/nav_host"
        app:navGraph= "@navigation/nav_item"
        android:tag="main_fragment_tag"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost= "true"
        />

আপনার ক্রিয়াকলাপে:

val navHostFragment = supportFragmentManager.findFragmentByTag("main_fragment_tag") as NavHostFragment
val mainFragment = navHostFragment.childFragmentManager.fragments[0] as MainFragment
mainFragment.mainFragmentMethod()


-2

আপনার ক্রিয়াকলাপে একটি খণ্ড বস্তু নির্ধারণ করুন। এবং প্রতিটি খণ্ড থেকে এই পদ্ধতিটি কল করে খণ্ডন অবজেক্টটি পাস করুন, সুতরাং স্থির খণ্ডের অবজেক্টটি প্রতিবার বর্তমান খণ্ডন প্রদর্শন করে ওভাররাইড করা হবে।

//method in MainActivity
private static Fragment fragment;

public void setFragment(Fragment fragment){
this.fragment = fragment;
}

//And from your fragment class, you can call
((<yourActivity in which fragment present>)getActivity()).setFragment(<your fragment object>);

//if you want to set it directly;
 ((<yourActivity in which fragment present>)getActivity()).fragment=<your fragment object>;

আরও ভাল পদ্ধতির জন্য আপনি খণ্ড থেকে ক্রিয়াকলাপে কলব্যাক সেট করতে পারেন এবং আপনার বর্তমান খন্ডের অবজেক্টটি পাস করতে পারেন।


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