অ্যান্ড্রয়েড ফ্রেগমেন্ট ব্যাক স্ট্যাকের সাথে সমস্যা


121

অ্যান্ড্রয়েড টুকরাটির ব্যাকস্ট্যাকটি যেভাবে কাজ করছে বলে মনে হচ্ছে তাতে আমি একটি বিশাল সমস্যা পেয়েছি এবং যে কোনও সহায়তা দেওয়া হচ্ছে তার জন্য সবচেয়ে কৃতজ্ঞ হব।

কল্পনা করুন আপনার 3 টি টুকরা রয়েছে

[1] [2] [3]

আমি চাই যে ব্যবহারকারী নেভিগেট করতে সক্ষম হবে [1] > [2] > [3]তবে ফেরার পথে (পিছনে বোতাম টিপছে) [3] > [1]

যেহেতু আমি কল্পনা করেছিলাম এটি এক্সএমএলে সংজ্ঞায়িত টুকরা হোল্ডারে addToBackStack(..)খণ্ডিত [2]করে এমন লেনদেন তৈরি করার সময় কল না করেই এটি সম্পন্ন হবে ।

এর বাস্তবতা দেখে মনে হচ্ছে যে যদি আমি [2]ব্যবহারকারী যখন ব্যাকটি বোতাম টিপে টিপতে আবার উপস্থিত হতে চাই না, তখন [3]অবশ্যই আমাকে addToBackStackলেনদেনে কল করতে হবে না যাতে খণ্ডটি দেখায় [3]। এটি সম্পূর্ণরূপে স্বজ্ঞাত বলে মনে হচ্ছে (সম্ভবত আইওএস ওয়ার্ল্ড থেকে আসছে)।

যাইহোক আমি যদি এটি এইভাবে করি তবে আমি যখন থেকে [1] > [2]ফিরে ফিরে টিপব তখন [1]প্রত্যাশার সাথে ফিরে আসি ।

যদি আমি যাই [1] > [2] > [3]এবং তারপরে ফিরে টিপুন তবে আমি ফিরে আসি [1](প্রত্যাশার মতো) as এখন অদ্ভুত আচরণের ঘটে যখন আমি চেষ্টা ও জাম্প করতে [2]থেকে আবার [1]। সবার [3]আগে সংক্ষিপ্তভাবে দৃশ্যমান হওয়ার আগে প্রদর্শিত হবে [2]। আমি যদি এই মুহুর্তে ফিরে টিপুন তবে [3]এটি প্রদর্শিত হবে এবং আমি আবার চাপ দিলে অ্যাপটি প্রস্থান করে।

এখানে কি চলছে তা বুঝতে কেউ আমাকে সহায়তা করতে পারেন?


এবং আমার মূল ক্রিয়াকলাপের জন্য এখানে লেআউট এক্সএমএল ফাইল রয়েছে:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:orientation="vertical" >

<fragment
        android:id="@+id/headerFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        class="com.fragment_test.FragmentControls" >
    <!-- Preview: layout=@layout/details -->
</fragment>
<FrameLayout
        android:id="@+id/detailFragment"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"

        />



আপডেট এই কোডটি আমি এনএভি হেরেরচি দ্বারা তৈরি করতে ব্যবহার করছি

    Fragment frag;
    FragmentTransaction transaction;


    //Create The first fragment [1], add it to the view, BUT Dont add the transaction to the backstack
    frag = new Fragment1();

    transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.detailFragment, frag);
    transaction.commit();

    //Create the second [2] fragment, add it to the view and add the transaction that replaces the first fragment to the backstack
    frag = new Fragment2();

    transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.detailFragment, frag);
    transaction.addToBackStack(null);
    transaction.commit();


    //Create third fragment, Dont add this transaction to the backstack, because we dont want to go back to [2] 
    frag = new Fragment3();
    transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.detailFragment, frag);
    transaction.commit();


     //END OF SETUP CODE-------------------------
    //NOW:
    //Press back once and then issue the following code:
    frag = new Fragment2();
    transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.detailFragment, frag);
    transaction.addToBackStack(null);
    transaction.commit();

    //Now press back again and you end up at fragment [3] not [1]

অনেক ধন্যবাদ


কিন্তু খণ্ডটি ওভারল্যাপিং হয়, যখন আমি ফ্রেগমেন্ট সি থেকে টুকরোটি এ
প্রিয়াঙ্কা

আমার একই সমস্যা আছে, আপনি কীভাবে এটি ঠিক করবেন?
প্রিয়াঙ্কা

আমার উত্তরগুলি উল্লেখ করুন .. এটি আপনাকে সাহায্য করতে পারে < স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 14971780/… >
এমডি খালি

উত্তর:


203

ব্যাখ্যা: এখানে কী চলছে?

আমরা যদি ডকুমেন্টেশনের মাধ্যমে জানি যে .replace()এটির সাথে সমান .remove().add()মনে রাখি:

একটি ধারককে যুক্ত করা একটি বিদ্যমান টুকরা প্রতিস্থাপন করুন। এটি মূলত একই সাথে remove(Fragment)যুক্ত হওয়া সমস্ত যোগ করা টুকরা containerViewIdএবং তারপরে add(int, Fragment, String)এখানে বর্ণিত একই যুক্তির সাথে আহ্বান করার সমান।

তারপরে যা ঘটছে তা হ'ল (এটিকে আরও স্পষ্ট করার জন্য আমি সংখ্যাগুলিতে যুক্ত করছি):

// transaction.replace(R.id.detailFragment, frag1);
Transaction.remove(null).add(frag1)  // frag1 on view

// transaction.replace(R.id.detailFragment, frag2).addToBackStack(null);
Transaction.remove(frag1).add(frag2).addToBackStack(null)  // frag2 on view

// transaction.replace(R.id.detailFragment, frag3);
Transaction.remove(frag2).add(frag3)  // frag3 on view

(এখানে সমস্ত বিভ্রান্তিকর জিনিস ঘটতে শুরু করে)

মনে রাখবেন যে .addToBackStack()কেবলমাত্র লেনদেন সেভ করছে সেগুলি খণ্ডটিকে নিজের মতো করে না! সুতরাং এখন আমরা frag3লেআউট আছে:

< press back button >
// System pops the back stack and find the following saved back entry to be reversed:
// [Transaction.remove(frag1).add(frag2)]
// so the system makes that transaction backward!!!
// tries to remove frag2 (is not there, so it ignores) and re-add(frag1)
// make notice that system doesn't realise that there's a frag3 and does nothing with it
// so it still there attached to view
Transaction.remove(null).add(frag1) //frag1, frag3 on view (OVERLAPPING)

// transaction.replace(R.id.detailFragment, frag2).addToBackStack(null);
Transaction.remove(frag3).add(frag2).addToBackStack(null)  //frag2 on view

< press back button >
// system makes saved transaction backward
Transaction.remove(frag2).add(frag3) //frag3 on view

< press back button >
// no more entries in BackStack
< app exits >

সম্ভাব্য সমাধান

FragmentManager.BackStackChangedListenerপিছনের স্ট্যাকের পরিবর্তনগুলি দেখার জন্য বাস্তবায়ন বিবেচনা করুন এবং onBackStackChanged()মেথোডে আপনার যুক্তি প্রয়োগ করুন :

  • লেনদেনের একটি গণনা ট্রেস;
  • নাম অনুসারে নির্দিষ্ট লেনদেন পরীক্ষা করুন FragmentTransaction.addToBackStack(String name);
  • প্রভৃতি

ভাল ব্যাখ্যা @ আরভিস। যাইহোক, আমরা কীভাবে ডেক্সটারমুনের মতো হ্যাকি উপায়গুলি বা পপব্যাকস্ট্যাক ব্যবহার করে নেমঞ্জার জাতীয় উপায় যা ট্রানজিশন অ্যানিমেশন বাজানোর সময় ফ্রেগমেন্ট দেখায় সেগুলি রোধ করতে পারি না?
মোমো

@ মোমো আপনি FragmentManager.BackStackChangedListenerব্যাক স্ট্যাকের পরিবর্তনগুলি দেখার জন্য প্রয়োগ করতে পারেন । onBackStackChanged()মেথোড দিয়ে আপনার সমস্ত লেনদেন নিরীক্ষণ করুন এবং প্রয়োজনীয় হিসাবে কাজ করুন: প্রাক্তন হিসাবে। ব্যাকস্ট্যাকে লেনদেনের একটি গণনা ট্রেস করুন; নাম ( FragmentTransaction addToBackStack (String name)) ইত্যাদি দ্বারা নির্দিষ্ট লেনদেন পরীক্ষা করুন
আরভিস

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

4
পিছনে স্ট্যাক ব্যবহার এড়ান! এটি সামগ্রিক দক্ষতার সাথে সত্যই সহায়তা করে না! প্লেইন রিপ্লেজ () ব্যবহার করুন বা প্রতিবার নেভিগেট করতে চাইলে আরও ভাল সরান / যুক্ত করুন!
6:54 এ স্ট্যাক করা হয়েছে

@ আরভিস আপনি কি পিএলএস আমাকে একই সমস্যা পেতে সাহায্য করতে পারেন .... স্ট্যাক কাউন্ট 0 কিন্তু এখনও আমার খণ্ডটি দৃশ্যমান?
এরম

33

রাইট !!! অনেক চুল টানানোর পরে অবশেষে এই কাজটি কীভাবে সঠিকভাবে করা যায় তা নিয়ে কাজ করেছি।

দেখে মনে হচ্ছে যেন খণ্ড [3] ভিউ থেকে সরিয়ে নেই যখন পিছনে টিপানো হয় তাই আপনাকে এটি ম্যানুয়ালি করতে হবে!

প্রথমত, প্রতিস্থাপন () ব্যবহার না করে পরিবর্তে অপসারণ এবং পৃথকভাবে যুক্ত ব্যবহার করুন। দেখে মনে হচ্ছে প্রতিস্থাপন () সঠিকভাবে কাজ করে না।

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

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if (keyCode == KeyEvent.KEYCODE_BACK)
    {
        if (getSupportFragmentManager().getBackStackEntryCount() == 0)
        {
            this.finish();
            return false;
        }
        else
        {
            getSupportFragmentManager().popBackStack();
            removeCurrentFragment();

            return false;
        }



    }

    return super.onKeyDown(keyCode, event);
}


public void removeCurrentFragment()
{
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

    Fragment currentFrag =  getSupportFragmentManager().findFragmentById(R.id.detailFragment);


    String fragName = "NONE";

    if (currentFrag!=null)
        fragName = currentFrag.getClass().getSimpleName();


    if (currentFrag != null)
        transaction.remove(currentFrag);

    transaction.commit();

}

আশাকরি এটা সাহায্য করবে!


এটি কাজ করে, তবে খণ্ডটি পুনরায় লোড হওয়ার পরে এটি আমার প্রকল্পে ব্যবহার করা যাবে না! কোনও পরামর্শ?
থারাকা নির্মনা

তবে, আমি যদি এটি করছি। আমি খালি স্ক্রিন পাচ্ছি যখন আমি সি থেকে এ
টুকরো টুকরো

আমি সন্দেহ করি যে অ্যারভিসের উত্তরটি আপনার সমস্যার উপরে কিছুটা আলোকপাত করবে
ক্রিস বার্চ

16

সবার আগে ধন্যবাদ চোখের খোলার ব্যাখ্যার জন্য @ আরভিসকে ধন্যবাদ।

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

যাইহোক আমি এটি এটি কিভাবে:

বর্তমানে ডিসপ্লেতে কেবল খণ্ড F1 রয়েছে।

f1 -> f2

Fragment2 f2 = new Fragment2();
this.getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.main_content,f2).addToBackStack(null).commit();

এখানে সাধারণ কিছু নেই। খণ্ড F2 এর চেয়ে এই কোডটি আপনাকে F3 খণ্ডে নিয়ে যায়।

f2 -> f3

Fragment3 f3 = new Fragment3();
getActivity().getSupportFragmentManager().popBackStack();
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.main_content, f3).addToBackStack(null).commit();

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

কথিত বিকল্পটি হ'ল:

final FragmentActivity activity = getActivity();
activity.getSupportFragmentManager().popBackStackImmediate();
activity.getSupportFragmentManager().beginTransaction().replace(R.id.main_content, f3).addToBackStack(null).commit();

এখানে আসলে f1 beofre এফ 3 এ চলতে সংক্ষিপ্তভাবে ফিরে যাওয়া হবে, সুতরাং সেখানে একটি সামান্য ত্রুটি।

এটি আসলে আপনাকে যা করতে হবে তা হ'ল স্ট্যাক আচরণকে ওভাররাইড করার দরকার নেই ...


6
তবে সমস্যা, এটি একটি সমস্যা
Zyoo

এটি ব্যাকস্ট্যাক পরিবর্তনগুলি শোনার চেয়ে "হ্যাক-এ" কম মনে হয়। ধন্যবাদ।
প্রচারিত

13

আমি জানি এটি একটি পুরানো কাতরণ তবে আমি একই সমস্যা পেয়েছি এবং এটি ঠিক করেছি:

প্রথমে একটি নামের সাথে ফ্র্যাগমেন্ট 1 যুক্ত করুন ব্যাকস্ট্যাকের (উদাহরণস্বরূপ "ফ্রেগ 1"):

frag = new Fragment1();

transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.detailFragment, frag);
transaction.addToBackStack("Frag1");
transaction.commit();

এবং তারপরে, আপনি যখনই ফ্রেগমেন্ট 1 এ ফিরে যেতে চান (তারপরে 10 টি টুকরো যোগ করার পরেও), কেবল নামটি দিয়ে পপব্যাকস্ট্যাকমিডিয়েটকে কল করুন:

getSupportFragmentManager().popBackStackImmediate("Frag1", 0);

আশা করি এটি কাউকে সাহায্য করবে :)


1
দুর্দান্ত উত্তর। আমাকে getSupportFramentedManager () ব্যবহার করতে হয়েছিল pop পপব্যাকস্ট্যাকমিডিয়েট ("ফ্রেগ 1", ফ্র্যাগমেন্টম্যানেজার। পিওপি_বিএসিপিসিপিএসিপিএস); এটি আমার ব্যবহারের ক্ষেত্রে কাজ করার জন্য এটি পেতে
ইলিয়াসবাগলি

1
আমাকে এই কোডটি কোথায় রাখতে হবে ???? getSupportFragmentManager ()। পপব্যাকস্ট্যাকমিডিয়েট ("ফ্রেগ 1", 0); উপর MainActivty বা onBackPress
পাভেল

এটা কাজ করছে না. :( এই আমার কোড, আমার ক্ষেত্রে অসম্পূর্ণ অংশ Overlaping এটা অসম্পূর্ণ অংশ একটি খোলা কিন্তু Frgment একটি টুকরা বি ওভারল্যাপ
প্রিয়াঙ্কা

ফ্র্যাগমেন্টম্যানেজার ফ্রেগমেন্টম্যানেজার = getActivity ()। GetSupportFraamentManager (); fragmentManager.popBackStack (FragmentA.class.getName (), FragmentManager.POP_BACK_STACK_INCLUSIVE); ফ্রেগমেন্ট ট্রান্সজিশন ফ্র্যাগমেন্ট ট্রানজেকশন = ফ্র্যাগমেন্টম্যানেজ.বার্গিন ট্রান্সঅ্যাকশন (); ফ্র্যাগমেন্টE ফ্রেগমেন্টই = নতুন ফ্র্যাগমেন্টই (); খণ্ড fragmentTransaction.commit ();
প্রিয়াঙ্কা

5

@ আরভিসের জবাবের পরে আমি আরও গভীর খনন করার সিদ্ধান্ত নিয়েছি এবং আমি এখানে এ সম্পর্কে একটি প্রযুক্তি নিবন্ধ লিখেছি: http://www.andreabaccega.com/blog/2015/08/16/how-to-avoid-frations-overlapping- কারণে-টু-backstack-দুঃস্বপ্ন-ইন-অ্যান্ড্রয়েড /

চারদিকে অলস বিকাশকারীদের জন্য For আমার সমাধানটি সর্বদা ব্যাকস্ট্যাকটিতে লেনদেন যুক্ত করে এবং FragmentManager.popBackStackImmediate()যখন প্রয়োজন হয় (স্বয়ংক্রিয়ভাবে) একটি অতিরিক্ত সম্পাদন করে ।

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

সুতরাং সংযুক্ত কোডটি এ -> বি -> সি (পিছন) -> এ ও এ -> বি -> সি -> ডি (পিছনে) -> সি (পিছনে) -> বি (পিছনে) -> এ অনুসরণ করবে

কোথায়

fm.beginTransaction().replace(R.id.content, new CFragment()).commit()

প্রশ্নে যেমন "বি" থেকে "সি" তে জারি করা হয়েছিল?

ঠিক আছে, ঠিক আছে এখানে কোড :)

public static void performNoBackStackTransaction(FragmentManager fragmentManager, String tag, Fragment fragment) {
  final int newBackStackLength = fragmentManager.getBackStackEntryCount() +1;

  fragmentManager.beginTransaction()
      .replace(R.id.content, fragment, tag)
      .addToBackStack(tag)
      .commit();

  fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
    @Override
    public void onBackStackChanged() {
      int nowCount = fragmentManager.getBackStackEntryCount();
      if (newBackStackLength != nowCount) {
        // we don't really care if going back or forward. we already performed the logic here.
        fragmentManager.removeOnBackStackChangedListener(this);

        if ( newBackStackLength > nowCount ) { // user pressed back
          fragmentManager.popBackStackImmediate();
        }
      }
    }
  });
}

1
এই লাইন fragmentManager.popBackStackImmediate () উপর ক্র্যাশ পেয়ে; ত্রুটি: java.lang.IllegalStateException: FragmentManager ইতিমধ্যে com.example.myapplication.FragmentA $ 2.onBackStackChanged (FragmentA.java:43) এ লেনদেন নির্বাহ করা হয়
প্রিয়াঙ্কা

1

আপনি যদি অ্যাডটোব্যাকস্ট্যাক () এবং পপব্যাকস্ট্যাক () দিয়ে লড়াই করছেন তবে কেবল ব্যবহার করুন

FragmentTransaction ft =getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, new HomeFragment(), "Home");
ft.commit();`

অনব্যাকপ্রেসডে আপনার ক্রিয়াকলাপে () ট্যাগের মাধ্যমে প্রাসঙ্গিক সন্ধান করুন এবং তারপরে আপনার জিনিসগুলি করুন

Fragment home = getSupportFragmentManager().findFragmentByTag("Home");

if (home instanceof HomeFragment && home.isVisible()) {
    // do you stuff
}

আরও তথ্যের জন্য https://github.com/DattaHujare/ নেভিগেশনড্রেয়ার আমি খণ্ডগুলি পরিচালনা করার জন্য অ্যাডটোব্যাকস্ট্যাক () ব্যবহার করি না।


0

আমি মনে করি, যখন আমি আপনার গল্পটি পড়ি তখন [3] পিছনের দিকেও থাকে। আপনি কেন এটি ঝলকানি দেখছেন তা এটি ব্যাখ্যা করে।

সমাধানটি স্ট্যাকের উপরে [3] কখনও সেট করা হবে না।


হাই jdekei আপনার ইনপুট জন্য ধন্যবাদ। সমস্যা হ'ল আমি দেখতে পাচ্ছি না যেখানে আমি ব্যাকস্টকে [3] যুক্ত করছি। আমি কোডের আরও একটি অংশ যুক্ত করেছি যা বোতাম ব্যবহার করে যে নেভিগেশনটি সম্পাদন করছিল (প্রোগ্রাম্যাটিকভাবে) ঠিক তা প্রদর্শন করে।
ক্রিস বার্চ

এটি আমাকেও সহায়তা করে তবে আমি আপনার কোড থেকে কেবল কর্ট্রফ্র্যাগমেন্ট এবং অন্য একটি খণ্ড চেকার ব্যবহার করি। প্রতিস্থাপন পদ্ধতিটি আমার পক্ষে কাজ করে, এটি s old method issue but now itঠিক আছে। ধন্যবাদ
ভিক্টর ভি।

0

আমার একই ধরণের সমস্যা হয়েছিল যেখানে আমার একই [এম 1.এফ 0] -> [এম 1.এফ 1] -> [এম 1.এফ 2] এর পরে একটি নতুন [এম 2] - এ কল করার পরে টানা 3 টুকরো টুকরোActivity হয়েছি Activity। যদি ব্যবহারকারী [এম 2] এ একটি বোতাম টিপে থাকে তবে আমি [এম 1, এফ 2] এর পরিবর্তে [এম 1, এফ 1] এ ফিরে যেতে চেয়েছিলাম যা ইতিমধ্যে প্রেসের আচরণগুলি করেছিল।

এটি সম্পাদন করার জন্য আমি [এম 1, এফ 2] মুছে ফেলি, [এম 1, এফ 1] এ কল শো, লেনদেন করা এবং তারপরে [এম 1, এফ 2] কে লুকিয়ে রেখে ফোনটি যুক্ত করুন। এটি অতিরিক্ত ব্যাক প্রেসটি সরিয়ে ফেলল যা অন্যথায় পেছনে ফেলে রাখা হত।

// Remove [M1.F2] to avoid having an extra entry on back press when returning from M2
final FragmentTransaction ftA = fm.beginTransaction();
ftA.remove(M1F2Fragment);
ftA.show(M1F1Fragment);
ftA.commit();
final FragmentTransaction ftB = fm.beginTransaction();
ftB.hide(M1F2Fragment);
ftB.commit();

হাই এই কোডটি করার পরে: আমি পিছনে কী টিপে ফ্রেগমেন্ট 2 এর মান দেখতে পারছি না। আমার কোড:

FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.frame, f1);
ft.remove(f1);

ft.add(R.id.frame, f2);
ft.addToBackStack(null);

ft.remove(f2);
ft.add(R.id.frame, f3);

ft.commit();

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event){

        if(keyCode == KeyEvent.KEYCODE_BACK){
            Fragment currentFrag =  getFragmentManager().findFragmentById(R.id.frame);
            FragmentTransaction transaction = getFragmentManager().beginTransaction();

            if(currentFrag != null){
                String name = currentFrag.getClass().getName();
            }
            if(getFragmentManager().getBackStackEntryCount() == 0){
            }
            else{
                getFragmentManager().popBackStack();
                removeCurrentFragment();
            }
       }
    return super.onKeyDown(keyCode, event);
   }

public void removeCurrentFragment()
    {
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        Fragment currentFrag =  getFragmentManager().findFragmentById(R.id.frame);

        if(currentFrag != null){
            transaction.remove(currentFrag);
        }
        transaction.commit();
    }

0

executePendingTransactions(), commitNow()কাজ হয়নি (

অ্যান্ড্রয়েডেক্স (জেটপ্যাক) এ কাজ করেছেন।

private final FragmentManager fragmentManager = getSupportFragmentManager();

public void removeFragment(FragmentTag tag) {
    Fragment fragmentRemove = fragmentManager.findFragmentByTag(tag.toString());
    if (fragmentRemove != null) {
        fragmentManager.beginTransaction()
                .remove(fragmentRemove)
                .commit();

        // fix by @Ogbe
        fragmentManager.popBackStackImmediate(tag.toString(), 
            FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.