নিজেকে অপসারণ করার জন্য একটি খণ্ড কীভাবে পাবেন, অর্থাৎ সমাপ্তির সমতুল্য ()?


230

আমি একটি অ্যাপটিকে সামঞ্জস্য লাইব্রেরি ব্যবহার করে টুকরো টুকরো ব্যবহার করতে রূপান্তর করছি। বর্তমানে আমার বেশ কয়েকটি ক্রিয়াকলাপ রয়েছে (এবিসিডি) যা একে অপরের সাথে চেইন করে, ডি'র একটি 'ওকে' রয়েছে যা চাপলে কলগুলি শেষ হয় যা পরে onActivityResult()সি এবং বি ধ্বংস করার জন্য বুদবুদ হয়ে যায় through

আমার প্রাক হনিকম্ব ভঙ্গুর সংস্করণের জন্য প্রতিটি ক্রিয়াকলাপ কার্যকরভাবে টুকরো টুকরো আফফ Bf সিএফ ডিএফ উপর একটি মোড়ক। সমস্ত ক্রিয়াকলাপের মাধ্যমে startActivityForResult()এবং onActivityResult()প্রতিটি খণ্ডের মধ্যে খুশি কল করতে পারে withingetActivity().finish()

আমার মধুচক্র সংস্করণে আমার যে সমস্যাটি হচ্ছে তা কেবল আমার একটি ক্রিয়াকলাপ, এ, এবং টুকরা বিএফ, সিএফ, ডিএফ ব্যবহার করে লোড করা হয় FragmentManager

আমি বুঝতে পারি না যে ডিএফ, সিএফ, এবং বিএফ কেটে ফেলার জন্য 'ঠিক আছে' চাপলে ডিএফ-এ কী করবেন?

আমি খণ্ডটি নিজেই স্ট্যাকের বাইরে বেরিয়ে আসার চেষ্টা করেছি তবে এর ব্যতিক্রম ঘটল। onActivityResult()অকেজো কারণ আমি ব্যবহার করে টুকরা লোড করেছি না startActivityForResult()

আমি কি এই সম্পর্কে পুরোপুরি ভুল পথে ভাবছি? লেনদেন পরিচালকের ব্যবহার করে পপ করার জন্য আমি কি এমন কোনও শ্রোতা বাস্তবায়ন করব যা পিতামণ্ডলের অংশ বা ক্রিয়াকলাপের সাথে যোগাযোগ করে?


7
((আপনারঅ্যাক্টিভিটি) getActivity ()) সম্পর্কে কি .অনব্যাকপ্রেসড ();
বিশ্বনাথ লেকশমনান

@ বিশ্বনাথলক্ষ্মানন আপনার মন্তব্যের উত্তরটি আমার পক্ষে উপকারী .. 1 আমার কাছ থেকে উপনীত হন
অভিষেক সিং

@ অভিষেকসিংহ শুনতে ভাল লাগলো :)
বিশ্বনাথ লেকশমানান

@ বিশ্বনাথলক্ষ্মানন :)
অভিষেক সিং

উত্তর:


62

আমি বুঝতে পারি না যে ডিএফ, সিএফ, এবং বিএফ কেটে ফেলার জন্য 'ঠিক আছে' চাপলে ডিএফ-এ কী করবেন?

পদক্ষেপ # 1: ডিএফকে ডি কে বলুন "ইয়ো! আমরা ঠিক আছে ক্লিক পেয়েছি!" কোনও পদ্ধতি কল করার মাধ্যমে, হয় নিজেই ক্রিয়াকলাপে, বা ক্রিয়াকলাপ দ্বারা সরবরাহ করা ইন্টারফেসের উদাহরণে।

পদক্ষেপ # 2: ডি এর মাধ্যমে খণ্ডগুলি সরিয়ে ফেলুন FragmentManager

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


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

1
@ পিজেএল: দুঃখিত, আমার অর্থ এ। শ্রোতা ইন্টারফেসটি ব্যবহারের এটি একটি কারণ, তাই একাধিক ক্রিয়াকলাপ সমস্ত ডিএফ থেকে "আমরা ঠিক আছে ক্লিক পেয়েছি" ইভেন্টে সাড়া দিতে পারে।
কমন্সওয়্যার

1
আমি বর্তমানে পোর্টিং করার সময় আমি টুকরো টুকরো ডিফের অ্যাক্টিভিটিস রেজাল্ট পদ্ধতি থেকে ক্রিয়াকলাপের মধ্যে একটি শ্রোতার পদ্ধতিটি কল করেছি যার পরে আমি ফ্র্যাগমেন্টম্যানেজারের পপব্যাকস্ট্যাককে কল করি। যাইহোক, এটি একটি নিষেধাজ্ঞার ফলস্বরূপ "বেআইনী স্ট্যাটেক্সট এক্সপশন: onSaveInstanceState 'এর পরে এই ক্রিয়াটি সম্পাদন করতে পারে না I আমি কীভাবে এটি কাটিয়ে উঠতে পারি সে সম্পর্কে কোনও ধারণা?
পিজেএল

1
@ ডিগোপালোমার: finish()যথেষ্ট হওয়া উচিত।
কমন্সওয়েয়ার

1
@ ইউজার ৩64649৯63৩: আমি যখন এটি তদন্ত করেছি তখন থেকে অনেকক্ষণ হয়ে গেছে, কিন্তু আইআইআরসি এটি পিছনের স্ট্যাকটি পপ করে নিলে ধ্বংস হয়ে যায়। onDestroy()আপনার টুকরোটিতে একটি পদ্ধতি যুক্ত করুন এবং এটি কল হয়েছে কিনা তা দেখুন।
কমন্সওয়্যার

313

যদিও এটি সবচেয়ে কাছের সমতুল্য নাও হতে পারে যা আমি ভাবতে পারি যে এটি কাজ করে তা সমর্থন / সামঞ্জস্য লাইব্রেরির সাহায্যে

getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();

অথবা

getActivity().getFragmentManager().beginTransaction().remove(this).commit();

অন্যথায়।

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


11
এই পদ্ধতির কাজ করার সময়, আপনি যদি addToBackStack (নাল) ব্যবহার করছেন তবে এটি পিছনে বোতাম হ্যান্ডলারটি +1 ছাড়বে। সুতরাং আপনি এটি দুইবার টিপতে হবে।
ব্যবহারকারী 123321

34
ফ্রেগমেন্টম্যানেজার থেকে টুকরোটিকে "পপ" করুন।
ব্যবহারকারী 123321

2
আমি উপরোক্ত পদ্ধতিটি চেষ্টা করেছি তবে এটি "জাভা-ল্যাং-অবৈধ স্টেট এক্সসেপশন-ক্যান-না-এই-অ্যাকশন-এর পরে অনসাইভেনস্ট্যান্স" করতে পারে এই ত্রুটিটি দিচ্ছে। সুতরাং ঠিক কোথায় আমাকে খণ্ডটি সরাতে হবে
KK_07k11A0585

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

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

263

আপনি নীচের পদ্ধতির ব্যবহার করতে পারেন, এটি দুর্দান্ত কাজ করে:

getActivity().getSupportFragmentManager().popBackStack();

44
এই উত্তরটি গ্রহণযোগ্যটির চেয়ে 10 গুণ ভাল - সোজা বিন্দুতে।
নিকিব 3ro

50
এটি গ্রহণযোগ্যটির চেয়ে নকশার ক্ষেত্রে 10 গুণ বেশি খারাপ। কোনও খণ্ডকে কোনও ক্রিয়াকলাপের জন্য একটি ছোট "সহায়ক" বলে মনে করা হয় এবং নিজের বা অন্যান্য খণ্ডের উপর নিয়ন্ত্রণ রাখা উচিত নয়
প্যাট্রিক

6
@ ওয়ালঞ্চা নির্দেশ করে বলে সমাধানটি সঠিক নয়। বিকাশকারী.অ্যান্ড্রয়েড.
com

2
আমিঅ্যাক্টিভিটিস রেজাল্টে এই পদ্ধতিটি ব্যবহার করছি এবং ত্রুটি পেয়েছি "onSaveInstanceState এর পরে এই ক্রিয়াটি সম্পাদন করতে পারবেন না"। আমি কীভাবে এটি সমাধান করতে পারি?
জয়েশকুমার সোজিত্র

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

36

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

public class MyActivity extends FragmentActivity implements SuicidalFragmentListener {

    // onCreate etc

    @Override
    public void onFragmentSuicide(String tag) {
        // Check tag if you do this with more than one fragmen, then:
        getSupportFragmentManager().popBackStack();
    }
}

public interface SuicidalFragmentListener {
    void onFragmentSuicide(String tag);
}

public class MyFragment extends Fragment {

    // onCreateView etc

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
           suicideListener = (SuicidalFragmentListener) activity;
        } catch (ClassCastException e) {
           throw new RuntimeException(getActivity().getClass().getSimpleName() + " must implement the suicide listener to use this fragment", e);
        }
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        // Attach the close listener to whatever action on the fragment you want
        addSuicideTouchListener();
    }

    private void addSuicideTouchListener() {
        getView().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              suicideListener.onFragmentSuicide(getTag());
            }
        });
    }
}

5
আত্মঘাতী অনেক ইমো স্টাইল? "সেলফক্লোজিং" বা "অটোক্লোজ" বা "স্মার্টক্লোজ" (আরবি)
ড্রিটানএক্স

21
এটি চিরকাল মারা যাচ্ছে না ;-(
ব্লুন্ডেল

3
অন্যান্য উত্তরগুলির তুলনায় এটি অনেক পরিষ্কার পদ্ধতি approach ক্রিয়াকলাপটি খণ্ড তৈরি করে এবং উপস্থাপন করে এবং এর জীবনচক্র নিয়ন্ত্রণ করা উচিত। যখন এমন কোনও কিছু ঘটে যা ইঙ্গিত দেয় যে খণ্ডটি আর দেখা উচিত নয়, তখন এটি ক্রিয়াকলাপটিকে জানিয়ে দেয় এবং ক্রিয়াকলাপটি এটিকে সরাতে দেয়।
ক্রিস্টোফার পিক্সলে ২৮:০৯

7
প্রযুক্তিগতভাবে, যদি আমাদের ক্রিয়াকলাপটি খণ্ডটিকে হত্যা করে, তবে খণ্ডটি আত্মঘাতী নয়। ক্রিয়াকলাপ হ'ল হোমসিডাল।
কেসি মারে

17

ক্রিয়াকলাপ / অ্যাপকম্প্যাটঅ্যাক্টিভিটিতে:

@Override
public void onBackPressed() {
    if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
        // if you want to handle DrawerLayout
        mDrawerLayout.closeDrawer(GravityCompat.START);
    } else {
        if (getFragmentManager().getBackStackEntryCount() == 0) {
            super.onBackPressed();
        } else {
            getFragmentManager().popBackStack();
        }
    }
}

এবং তারপরে খণ্ডটিতে কল করুন:

getActivity().onBackPressed();

বা অন্যান্য উত্তরে বলা মত, খণ্ডে এটি কল করুন:

getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();

5

আপনি যদি নতুন নেভিগেশন উপাদান ব্যবহার করছেন তবে এটি সহজ

findNavController().popBackStack()

এটি আপনার পিছনে সমস্ত ফ্র্যাগমেন্টট্রান্সঅ্যাকশন করবে।


4

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


3

আমি এটির জন্য সহজ পদ্ধতি তৈরি করি

popBackStack(getSupportFragmentManager());

আমার ক্রিয়াকলাপের ক্লাসে এটি রাখার চেয়ে বেশি

public static void popBackStack(FragmentManager manager){
        FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0);
        manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }

এটা দুর্দান্ত কাজ, মজা আছে!


2
আমি আপনার পদ্ধতির উদ্দেশ্য পাই না। আসল পপব্যাকস্ট্যাকটি পুরোপুরি পর্যাপ্ত বলে মনে হচ্ছে।
অবিশ্বাস্য জানুয়ারী

1

onCreate:

//Add comment fragment
            container = FindViewById<FrameLayout>(Resource.Id.frmAttachPicture);
            mPictureFragment = new fmtAttachPicture();

            var trans = SupportFragmentManager.BeginTransaction();
            trans.Add(container.Id, mPictureFragment, "fmtPicture");
            trans.Show(mPictureFragment); trans.Commit();

এইভাবে আমি ক্লিক ইভেন্ট 1 এ টুকরোটি লুকিয়ে রাখি

//Close fragment
    var trans = SupportFragmentManager.BeginTransaction();
    trans.Hide(mPictureFragment);
    trans.AddToBackStack(null);
    trans.Commit();

তারপরে এটি ইভেন্ট ইন 2 দেখায়

var trans = SupportFragmentManager.BeginTransaction();
            trans.Show(mPictureFragment); trans.Commit();

1

ব্যাকস্ট্যাকের ইতিহাসের চতুর্থ খণ্ড থেকে প্রথম পর্যন্ত পপব্যাকের প্রয়োজন হলে ট্যাগগুলি ব্যবহার করুন !!!

আপনি যখন প্রথম খণ্ড যুক্ত করবেন তখন আপনার এমন কিছু ব্যবহার করা উচিত:

getFragmentManager.beginTransaction.addToBackStack("A").add(R.id.container, FragmentA).commit() 

অথবা

getFragmentManager.beginTransaction.addToBackStack("A").replace(R.id.container, FragmentA).commit()

এবং আপনি যখন খণ্ড বি, সি এবং ডি প্রদর্শন করতে চান আপনি এটি ব্যবহার করেন:

getFragmentManager.beginTransaction.addToBackStack("B").replace(R.id.container, FragmentB, "B").commit()

এবং অন্যান্য অক্ষর ....

এ-তে ফিরে আসার জন্য Fragment, কেবল কল করুন popBackStack(0, "A"), হ্যাঁ, আপনি যুক্ত করার সময় আপনি যে পতাকাটি নির্দিষ্ট করেছেন তা ব্যবহার করুন এবং নোট করুন যে কমান্ডের মধ্যে এটি একই পতাকা হওয়া উচিত, কমান্ডে addToBackStack()ব্যবহৃত কোনওটি প্রতিস্থাপন বা যুক্ত করা উচিত নয়।

আপনাকে স্বাগতম ;)


আমি 'পপব্যাকস্ট্যাক (0, "এ") পরীক্ষা করেছি এবং আমার অ্যাপ্লিকেশনটি খণ্ড A এ ফিরে আসে, তবে আমি চাই কেবলমাত্র সেই অংশটি ব্যাক স্ট্যাক থেকে অপসারণ করা হবে ... আমি কীভাবে পর্দায় প্রদর্শিত না করে স্ট্যাক থেকে টুকরোটি সরিয়ে ফেলতে পারি ??
KryNaC

1

একই খণ্ডের ভিতরে থাকা অবস্থায় একটি খণ্ড বন্ধ করতে

getActivity().onBackPressed();

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