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


218

বলুন আমার একটি ক্রিয়াকলাপ রয়েছে যাতে টুকরো টুকরা রয়েছে প্রোগ্রামগতভাবে:

private void animateToFragment(Fragment newFragment, String tag) {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, tag);
    ft.addToBackStack(null);
    ft.commit();
}

পূর্ববর্তী খণ্ডটি যে দৃশ্যমান ছিল সেটিতে ফিরে আসার সর্বোত্তম উপায় কী?

আমি অ্যান্ড্রয়েডে বোতাম ক্লিকের উপর ট্রিগার ব্যাক-বাটন কার্যকারিতা পেয়েছি তবে আমি ভাবছি কোনও পিছনের ইভেন্টের সিমুলেট করা সঠিক উপায় নয় (এবং আমি এটি কোনওভাবে কাজ করতে পারি না):

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));

কল করা হচ্ছে finish() কেবল সেই ক্রিয়াকলাপটি বন্ধ করে দেয় যার সাথে আমি আগ্রহী নই।

এই সম্পর্কে আরও ভাল উপায় আছে?

উত্তর:


354

getFragmentManager().popBackStack()পদ্ধতিগুলি দেখুন ( এটি থেকে বেছে নেওয়া বেশ কয়েকটি রয়েছে)

http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack ()


91
getFragmentManager().popBackStackImmediate();কৌতুকটি করেছেন ধন্যবাদ।
বি।

1
যদিও আমি এই পদ্ধতিটি রাখব? আমার ট্যাব শ্রোতা?
rasen58

1
কোডটি না দেখে, বলা শক্ত ... তবে আপনি যখন বর্তমান খণ্ডটিকে "বন্ধ" করতে চান এবং পূর্ববর্তী খণ্ডটিতে ফিরে যেতে চান তখন কোডটি প্রয়োগ করা হয় এমন কোডের বিভাগে যাওয়া উচিত।
অবিরাম

1
getSupportFragmentManager ()
ভিলিউস

5
আপনার কোডটিতে "addToBackStack (" ট্যাগ ")" যুক্ত করতে ভুলবেন না। "। fragmentManager.beginTransaction () প্রতিস্থাপন (R.id.content_frame, টুকরা) .addToBackStack (" ট্যাগটি ") কমিট ();"। আপনি যদি addToBackStack (নাল) লিখেন তবে এটি নিজেই এটি পরিচালনা করবে তবে আপনি যদি কোনও ট্যাগ দেন তবে আপনার এটি ম্যানুয়ালি হ্যান্ডেল করা উচিত।
খালেদ সাইফ

129

প্রদত্ত অন্যান্য উত্তরের বিস্তারিত জানাতে, এটি আমার সমাধান (কোনও ক্রিয়াকলাপে স্থাপন করা):

@Override
public void onBackPressed(){
    FragmentManager fm = getFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
        Log.i("MainActivity", "popping backstack");
        fm.popBackStack();
    } else {
        Log.i("MainActivity", "nothing on backstack, calling super");
        super.onBackPressed();  
    }
}

5
এবং কেন যে ঘটছে। টুকরা উদাহরণে developer.android.com/training/basics/fragments/index.html তারা onbackpressed ঘটনা overiding হয়নি এবং তারা backstack টুকরা করতে পারবেন। আমি ব্যবহার করেছি trasaction.addToBackStack (নাল); কিন্তু কিছুই হয় না। কেন আপনি ব্যাখ্যা করতে পারেন?
মুর্তজা খুরশীদ হুসেন

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

2
আমার ক্ষেত্রে fm.getBackStackEntryCount() > 1যখন স্ট্যাকের মধ্যে কেবল প্রথম খণ্ড থাকে তখন আমাকে ক্রিয়াকলাপটি কল করতে হয়েছিল।
ফ্যাসুন্দো ওলানো

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

29

যখন আমরা টুকরোগুলি আপডেট / যোগ করছি,

অন্তর্ভুক্ত করা উচিত .addToBackStack()

getSupportFragmentManager().beginTransaction()
    .add(detailFragment, "detail") // Add this transaction to the back stack (name is an optional name for this back stack state, or null).
    .addToBackStack(null)
    .commit();

এর পরে যদি আমরা getFragments.popBackStackImmediate()টুকরোগুলি যোগ / আপডেট করে এবং বর্তমান স্ক্রিনে ফিরে যাই তবে আমরা সত্যটি ফিরিয়ে দেব ।


7

আপনার অনব্যাকপ্রেসড () পদ্ধতিতে সেই লাইনটি যুক্ত করুন। পপব্যাকস্ট্যাকমিডিয়েট () পদ্ধতিটি যদি আপনার পিছনের স্ট্যাকের কোনও খণ্ড থাকে তবে আপনাকে পূর্ববর্তী খণ্ডে ফিরিয়ে আনবে `

if(getFragmentManager().getBackStackEntryCount() > 0){
     getFragmentManager().popBackStackImmediate();
}
else{
    super.onBackPressed();
}

`


5

আপনি যখন প্রাথমিক খণ্ডে টিপুন তখন অ্যাপটি বন্ধ করতে চান যখন এই সমাধানটি নীচে বার ভিত্তিক টুকরা নেভিগেশনের জন্য পুরোপুরি কাজ করে।

অন্যদিকে আপনি যখন দ্বিতীয় কোডটি খণ্ডন করছেন (টুকরো টুকরো টুকরো) যা আমার কোডটিতে "বিস্তৃতপিজা" হিসাবে সংজ্ঞায়িত হয়েছে এটি প্রাথমিক খণ্ডের আগের অবস্থানে ফিরে আসবে। চিয়ার্স!

পিছনে চাপযুক্ত অভ্যন্তরের ক্রিয়াকলাপগুলি এতে রাখুন:

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

if (home instanceof FragmentDetailedPizza && home.isVisible()) {
    if (getFragmentManager().getBackStackEntryCount() != 0) {
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
} else {
    //Primary fragment
    moveTaskToBack(true);
}

এবং অন্যান্য খণ্ডটি এর মতো চালু করুন:

Fragment someFragment = new FragmentDetailedPizza();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.container_body, someFragment, "DetailedPizza");
transaction.addToBackStack("DetailedPizza");
transaction.commit();

3

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

getActivity().onBackPressed();

আপনার কোনও খণ্ড থেকে এক ধাপ পিছনে যেতে;


1

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

if ( getFragmentManager().getBackStackEntryCount() > 0) 
{
          getFragmentManager().popBackStack();
          return;
}
super.onBackPressed();

1

সেই খণ্ডটি আবার আসার জন্য, কেবল সেই অংশটি ব্যাকস্ট্যাকে যুক্ত করুন যা আপনি পিছনে চাপতে চান, যেমন:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Fragment fragment = new LoginFragment();
        //replacing the fragment
        if (fragment != null) {
            FragmentTransaction ft = ((FragmentActivity)getContext()).getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.content_frame, fragment);
            ft.addToBackStack("SignupFragment");
            ft.commit();
        }
    }
});

উপরে ক্ষেত্রে, আমি খোলার করছি LoginFragmentযখন Button buttonটেপা হলে, এই মুহূর্তে ব্যবহারকারী রয়েছে SignupFragment। সুতরাং যদি addToBackStack(TAG)বলা হয়, কোথায় TAG = "SignupFragment", তারপর যখন পিছনে বোতাম টিপানো হয় LoginFragment, আমরা ফিরে আসিSignUpFragment

শুভ কোডিং!


আমি মনে করি, ট্যাগ প্রভাবিত করে না, এটি এমনকি শূন্য হতে পারে।
শীতলমান্ড

1

fragment_tran.addToBackStack(null)শেষ টুকরা যোগ করে, আমি শেষ খণ্ডে ফিরে আসতে সক্ষম হয়েছি।

নতুন খণ্ড যুক্ত করা হচ্ছে :

view.findViewById(R.id.changepass).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.container, new ChangePassword());
            transaction.addToBackStack(null);
            transaction.commit();
        }
    });

1

আমি এখানে একই ধারণাটি দেখতে এসেছি এবং এর মধ্যে আমি নিজেরাই উঠে এসেছি, যা আমি বিশ্বাস করি যে এটি খারাপ নয় এবং ভিউপ্যাজারের সাথে থাকলে কাজ করে।

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

@Override
public void onBackPressed() {
    if(viewPager.getCurrentItem()>0){
        viewPager.setCurrentItem(viewPager.getCurrentItem()-1);
    } else {
        super.onBackPressed();
        this.close();
    }
}

private void close(){
    this.finish();
}

এটির পতন হতে পারে, যেমন এটি প্রতিবার কেবল একটি পথ ছেড়ে যায়, সুতরাং ট্যাবগুলি উপস্থিত থাকলে এটি দুর্দান্ত কাজ করতে পারে না এবং আপনি টুকরো টুকরো টুকরো টুকরো করে অবস্থানগুলি স্যুইচ করেন, (0 থেকে 2 অবধি পিছনে চাপলে আপনাকে চাপ দেওয়া হবে) 1, 0 এর পরিবর্তে)

আমার ক্ষেত্রে, ট্যাবগুলি ছাড়া ভিউপাগারে 2 টুকরা সহ, এটি দুর্দান্তভাবে কাজ করে।


অনুরূপ প্রশ্নের ইতিমধ্যে উত্তর দেওয়া হয়েছে। stackoverflow.com/questions/10863572/...
AtifSayings

0

কোড নীচে চেষ্টা করুন:

@Override
    public void onBackPressed() {
        Fragment myFragment = getSupportFragmentManager().findFragmentById(R.id.container);
        if (myFragment != null && myFragment instanceof StepOneFragment) {
            finish();
        } else {
            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                getSupportFragmentManager().popBackStack();
            } else {
                super.onBackPressed();
            }
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.