নতুন নেমকন্ট্রোলারের সাথে বটমনাভিগেশনভিউ ব্যবহার করার সময় খণ্ডকে জীবিত রাখার কোনও উপায় আছে কি?


96

আমি নতুন নেভিগেশন উপাদান ব্যবহার করার চেষ্টা করছি। আমি নেভকন্ট্রোলারের সাথে একটি নীচে নেভিগেশনভিউ ব্যবহার করি: নেভিগেশন ইউআই.সেটআপ উইথনাভ কনট্রোলার (তলদেশ ন্যাভিগেশন, নাভ্যাকন্ট্রোলার)

তবে আমি যখন খণ্ডগুলি স্যুইচ করছি, সেগুলি প্রতিবার ধ্বংস / তৈরি করা হয় যদিও সেগুলি আগে ব্যবহৃত হয়েছিল।

আমাদের প্রধান টুকরোগুলি আমাদের বটমনাভিগেশনভিউয়ের সাথে লিঙ্ক রাখার কোনও উপায় আছে?


4
ইস্যুয়েট্রেকের.কম। / মন্তব্য / 8008773 এর প্রতি মন্তব্য হিসাবে দেখা যাচ্ছে এটি শেষ পর্যন্ত সমাধান করা হবে। আমি যদি কৌতূহলী হয়ে থাকি তবে যদি ভাবেন লোকের কাছে একটি সস্তা কাজ থাকে যা অন্তর্বর্তী সময়ে এই কাজটি করার জন্য গ্রন্থাগারটি ত্যাগ করার সাথে জড়িত না।
জিমি আলেকজান্ডার

উত্তর:


69

এটা চেষ্টা কর.

নেভিগেটর

কাস্টম নেভিগেটর তৈরি করুন।

@Navigator.Name("custom_fragment")  // Use as custom tag at navigation.xml
class CustomNavigator(
    private val context: Context,
    private val manager: FragmentManager,
    private val containerId: Int
) : FragmentNavigator(context, manager, containerId) {

    override fun navigate(destination: Destination, args: Bundle?, navOptions: NavOptions?) {
        val tag = destination.id.toString()
        val transaction = manager.beginTransaction()

        val currentFragment = manager.primaryNavigationFragment
        if (currentFragment != null) {
            transaction.detach(currentFragment)
        }

        var fragment = manager.findFragmentByTag(tag)
        if (fragment == null) {
            fragment = destination.createFragment(args)
            transaction.add(containerId, fragment, tag)
        } else {
            transaction.attach(fragment)
        }

        transaction.setPrimaryNavigationFragment(fragment)
        transaction.setReorderingAllowed(true)
        transaction.commit()

        dispatchOnNavigatorNavigated(destination.id, BACK_STACK_DESTINATION_ADDED)
    }
}

নাভহস্টফ্রেগমেন্ট

কাস্টম নাভহাস্টফ্রেগমেন্ট তৈরি করুন।

class CustomNavHostFragment: NavHostFragment() {
    override fun onCreateNavController(navController: NavController) {
        super.onCreateNavController(navController)
        navController.navigatorProvider += PersistentNavigator(context!!, childFragmentManager, id)
    }
}

নেভিগেশন.এক্সএমএল

খণ্ড ট্যাগের পরিবর্তে কাস্টম ট্যাগ ব্যবহার করুন।

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/navigation"
    app:startDestination="@id/navigation_first">

    <custom_fragment
        android:id="@+id/navigation_first"
        android:name="com.example.sample.FirstFragment"
        android:label="FirstFragment" />
    <custom_fragment
        android:id="@+id/navigation_second"
        android:name="com.example.sample.SecondFragment"
        android:label="SecondFragment" />
</navigation>

ক্রিয়াকলাপ বিন্যাস

নাভহোস্টফ্রেগমেন্টের পরিবর্তে কাস্টমনাভহস্টফ্রেগমেন্ট ব্যবহার করুন।

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="com.example.sample.CustomNavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/bottom_navigation"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/navigation" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_navigation"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:menu="@menu/navigation" />

</androidx.constraintlayout.widget.ConstraintLayout>

হালনাগাদ

আমি নমুনা প্রকল্প তৈরি করেছি। লিঙ্ক

আমি কাস্টম নাভহাস্টফ্রেগমেন্ট তৈরি করি না। আমি ব্যবহার navController.navigatorProvider += navigator


4
যদিও এই সমাধানটি কাজ করে ( fragmentsপুনরায় ব্যবহৃত হয়, পুনরায় তৈরি হয় না), নেভিগেশনে সমস্যা আছে। প্রতিটি menuitemমধ্যে bottomnavigationviewপ্রাথমিক বিবেচনা করা হয় - সুতরাং যখন BACKটেপা হলে, অ্যাপ্লিকেশন শেষ (অথবা শীর্ষ উপাদান যায়)। আরও ভাল সমাধান হ'ল ইউটিউব অ্যাপের মতো আচরণ করা: (1) হোম ট্যাপ করুন; (2) আলতো চাপুন; (3) ইনবক্সে আলতো চাপুন; (4) আলতো চাপুন; (5) আলতো চাপুন BACK- ইনবক্সে যায়; (6) আলতো চাপুন BACK- বাড়িতে যায়; ()) ট্যাপ BACK- অ্যাপ বিদ্যমান। সংক্ষেপে, BACK" menuitems" এর মধ্যে ইউটিউব কার্যকারিতা আইটেমগুলি পুনরাবৃত্তি না করে সাম্প্রতিকতমটিতে ফিরে যায়।
স্থানান্তরিত করুন

4
কীভাবে পিছনে বাটন কার্যকারিতা রাখবেন? পিছনের বোতামটি চাপলে অ্যাপ শেষ হয়।
ফ্রান্সিস

4
@ জেএল ৪, আমারও একই সমস্যা ছিল, সম্ভবত আপনি app:navGraphআপনার ক্রিয়াকলাপের নাভহাস্টফ্রেগমেন্ট থেকে সরিয়ে দিতে ভুলে গেছেন ।
পল চেরেনকো

6
গুগল কেন এই কার্যকারিতাটি বক্সের বাইরে রাখে না?
আর্সেনিয়াস

55
ন্যাভিগেশন কম্পোনেন্টটি একটি সমস্যা হয়ে উঠতে হবে যাতে অন্য সমস্যা না হয়ে যায় তাই প্রোগ্রামারকে অবশ্যই এ জাতীয় কাজ তৈরি করতে হবে।
অ্যারি আগুং

24

গুগল স্যাম্পল লিঙ্কগুলি আপনার অ্যাপ্লিকেশনটিতে নেভিগেশন এক্সটেনশনগুলি কেবল অনুলিপি করুন এবং উদাহরণ হিসাবে কনফিগার করুন। দুর্দান্ত কাজ করে।


4
তবে এটি কেবল নীচের নেভিগেশনের জন্যই কাজ করে। আপনার যদি সাধারণ নেভিগেশন থাকে তবে আপনার সমস্যা আছে
জর্জি চেবোটারেভ

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

@ কোডেডিআরআইএনও আমাকেও নবায়ন করেছে, যদিও আমি কোটলিন ফাইলটি দিয়ে চেষ্টা করেছি এবং স্যসসফুল ন্যাভিগেশনটি এইভাবে স্থির করে রেখেছি : imgur.com/a/DcsKqPr এটি "প্রতিস্থাপন" করে না, এর পাশেই, অ্যাপ্লিকেশনটি ভারী এবং স্টকিং হয়ে গেছে বলে মনে হয়।
অ্যাকো পিট

@ আকৌপিট্তা আপনি জাভাতে কোনও সমাধান খুঁজে পেয়েছেন?
विकासকিনবার্গ

11

অনেক ঘন্টা গবেষণার পরে আমি সমাধান খুঁজে পেয়েছি। এটি আমাদের সামনে ঠিক সময় ছিল :) একটি ফাংশন রয়েছে: popBackStack(destination, inclusive)যা ব্যাকস্ট্যাকের মধ্যে পাওয়া গেলে প্রদত্ত গন্তব্যটিতে নেভিগেট করে। এটি বুলিয়ানকে ফেরত দেয়, তাই যদি কন্ট্রোলারটি খণ্ডটি না খুঁজে পায় তবে আমরা ম্যানুয়ালি সেখানে নেভিগেট করতে পারি।

if(findNavController().popBackStack(R.id.settingsFragment, false)) {
        Log.d(TAG, "SettingsFragment found in backStack")
    } else {
        Log.d(TAG, "SettingsFragment not found in backStack, navigate manually")
        findNavController().navigate(R.id.settingsFragment)
    }

কিভাবে এবং কোথায় এটি ব্যবহার করবেন? আমি যদি খণ্ড A থেকে B তে নেভিগেট করি, তবে বি থেকে A এ কীভাবে আমি অ্যানক্রাইটভিউ () এবং অনভিউক্রিয়েটেড () পদ্ধতিগুলি কল না করে সংক্ষেপে খণ্ড A পুনরায় চালু না করে যেতে পারি
কিশন সোলঙ্কি

@ উসামা সাeedদুস: আপনি কী কোড ব্যবহার করতে পারেন দয়া করে? কিশন যে উল্লেখ করেছেন তা পছন্দ করুন Like
কোড_লাইফ


1

এখন পর্যন্ত পাওয়া যায় না।

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

আপনি আপনার ডেটা জীবনচর্চা-সচেতন পর্যবেক্ষণযোগ্য করতে লাইভ ডেটা ব্যবহার করতে পারেন


4
এটি প্রকৃতপক্ষে সত্য এবং ডেটা> ভিউ তবে সমস্যাটি তখন আপনি যখন দর্শন স্থিতি রাখতে চান, যেমন একাধিক পৃষ্ঠাগুলি লোড হয়েছে এবং ব্যবহারকারী স্ক্রল করে রেখেছেন :)।
জোয়াকিম লে

1

আমি @STAR_ZERO দ্বারা সরবরাহিত লিঙ্কটি ব্যবহার করেছি এবং এটি দুর্দান্ত কাজ করে। যাদের পিছনের বোতামটি নিয়ে সমস্যা রয়েছে তাদের জন্য আপনি এটিকে ক্রিয়াকলাপ / এনএভি হোস্টে এটি পরিচালনা করতে পারেন।

override fun onBackPressed() {
        if(navController.currentDestination!!.id!=R.id.homeFragment){
            navController.navigate(R.id.homeFragment)
        }else{
            super.onBackPressed()
        }
    }

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

বিটিডব্লিউ, এই সমাধানটির জন্য উপরে_ স্টেট_ফ্রেগমেন্ট ব্যবহার করে STAR_ZERO দ্বারা সরবরাহিত সমাধান লিঙ্কটির সাথে একত্রে কাজ করা দরকার


আইডিকে কেন তবে কারেন্টস্টেস্টিনেশন !!। আইডি সবসময় আমাকে সমস্ত 3 টুকরোগুলির জন্য একই মান দেয়
অবশেক দাস

1

@ পাইওটার-প্রাস দ্বারা সরবরাহিত সমাধানটি আমাকে সহায়তা করেছিল, তবে আমাকে কিছু বর্তমান গন্তব্য চেক যোগ করতে হয়েছিল:

if (navController.currentDestination?.id == resId) {
    return       //do not navigate
}

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


আমি খুশি যে আমার সমাধান আপনার পক্ষে কাজ করেছে। আমি ব্যাকস্ট্যাক থেকে টুকরোগুলি কল করার আগে নীচে ন্যাভিগেশনভিউতে বর্তমান মেনু আইটেমটি যাচাই করছি: নীচে নেভিগেশনভিউ.সেটঅন নেভিগেশন আইটেমসিলেক্টলিস্টার
প্রুস

0

অ্যান্ড্রয়েড ডকুমেন্টেশন অনুসারে ,

ফ্রেগমেন্ট কনটেনারভিউ ব্যবহার করে নাভহোস্টফ্রেগমেন্ট তৈরি করার সময় অথবা যদি ম্যানুয়ালি একটি ফ্রেগমেন্ট ট্রান্সজেকশনের মাধ্যমে আপনার ক্রিয়াকলাপে নাভহস্টফ্রেগমেন্ট যুক্ত করা হয়, নেভিগেশন.ফাইন্ডনাভকন্ট্রোলারের (ক্রিয়াকলাপ, @ আইড্রেস ইন) এর মাধ্যমে একটি ক্রিয়াকলাপের NavController পুনরুদ্ধারের প্রচেষ্টা ব্যর্থ হবে। পরিবর্তে আপনার সরাসরি NavHostFraਮੈਂਟ থেকে NavController পুনরুদ্ধার করা উচিত।

আপনার নাভি_স্টাস্ট_ফ্র্যাগমেন্টটি -> ফ্রেগমেন্টকন্টিনিয়র ভিউতে এবং নেভাকন্ট্রোলার পুনরুদ্ধারে করুন

    val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
    val navController = navHostFragment.navController

আপনি এই পদ্ধতির সাহায্যে নেভিগেশন উপাদানগুলির সাথে খণ্ডের অবস্থা সংরক্ষণ করতে পারেন

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