অ্যান্ড্রয়েড ফ্রেগমেন্ট- যখন অন্য একটি খণ্ডের উপরে চাপ দেওয়া হয় তখন কোনও খণ্ডে দর্শনগুলির রাজ্যগুলি কীভাবে সংরক্ষণ করা যায়


137

অ্যান্ড্রয়েডে, একটি টুকরা (বলুন FragA) ব্যাকস্ট্যাকের সাথে যুক্ত হয় এবং অন্য একটি টুকরা (বলুন FragB) শীর্ষে আসে। পিছনে আঘাত FragAকরার সময় শীর্ষে আসে এবং onCreateView()তাকে ডাকা হয়। এখন আমি এটির উপরে চাপ FragAদেওয়ার আগে একটি বিশেষ অবস্থায় ছিলাম FragB

আমার প্রশ্ন হ'ল আমি কীভাবে FragAএর আগের অবস্থায় ফিরিয়ে আনতে পারি ? রাষ্ট্রকে বাঁচানোর কোনও উপায় আছে (যেমন কোনও বান্ডিল বলুন) এবং যদি তাই হয় তবে আমার কোন পদ্ধতিটি ওভাররাইড করা উচিত?

উত্তর:


98

ইন টুকরা নির্দেশিকা FragmentList উদাহরণ আপনি পেতে পারেন:

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("curChoice", mCurCheckPosition);
}

যা আপনি পরে এর মতো ব্যবহার করতে পারেন:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if (savedInstanceState != null) {
        // Restore last state for checked position.
        mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
    }
}

আমি খণ্ডগুলিতে একটি শিক্ষানবিশ তবে এটি আপনার সমস্যার সমাধানের মতো বলে মনে হচ্ছে;) অন্যাকটিভিটিক্রিটযুক্তটি পিছনের স্ট্যাক থেকে টুকরো টুকরো টুকরো করার পরে ডাকা হবে।


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

57
এটি সেভিআইনস্ট্যান্সস্টেটে কল দেয় না - কেন হবে? সুতরাং, এই পদ্ধতির কাজ করে না।
মধ্যরাত

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

26
রেকর্ডের জন্য এই পদ্ধতিরটি ভুল এবং এটির আপ-ভোটের কাছে কোনও জায়গা নেই। onSaveInstanceStateকেবল তখনই বলা হয় যখন এটি সম্পর্কিত ক্রিয়াকলাপ বন্ধ হয়ে যায়।
মার্টিন কনেকনি

16
onSaveInstanceState () কে ওফল বলা হয় যখন কনফিগারেশনের পরিবর্তন ঘটে এবং ক্রিয়াকলাপটি নষ্ট হয়ে যায়, এই উত্তরটি ভুল
তাদাস ভ্যালাইটিস

83

অসম্পূর্ণ অংশ এর onSaveInstanceState(Bundle outState)যদি না টুকরা এর কার্যকলাপ নিজেই এবং সংযুক্ত টুকরা তে এটি কল নামক করা হবে না। সুতরাং কোনও কিছু (সাধারণত ঘূর্ণন) কার্যকলাপে বাধ্য না করা SaveInstanceStateএবং পরে এটিকে পুনরুদ্ধার করা না হওয়া পর্যন্ত এই পদ্ধতিটি বলা হবে না । তবে যদি আপনার কেবলমাত্র একটি ক্রিয়াকলাপ থাকে এবং এর ভিতরে টুকরাগুলির বিশাল সেট থাকে (এর নিবিড় ব্যবহার সহ replace) এবং অ্যাপ্লিকেশনটি কেবলমাত্র একটি অভিমুখী ক্রিয়াকলাপে চলে তবে এটি onSaveInstanceState(Bundle outState)দীর্ঘ সময়ের জন্য ডাকা যাবে না।

আমি তিনটি সম্ভাব্য কাজের চক্র জানি।

প্রথম:

গুরুত্বপূর্ণ ডেটা ধরে রাখতে খণ্ডটির যুক্তিগুলি ব্যবহার করুন:

public class FragmentA extends Fragment {
    private static final String PERSISTENT_VARIABLE_BUNDLE_KEY = "persistentVariable";

    private EditText persistentVariableEdit;

    public FragmentA() {
        setArguments(new Bundle());
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_a, null);

        persistentVariableEdit = (EditText) view.findViewById(R.id.editText);

        TextView proofTextView = (TextView) view.findViewById(R.id.textView);

        Bundle mySavedInstanceState = getArguments();
        String persistentVariable = mySavedInstanceState.getString(PERSISTENT_VARIABLE_BUNDLE_KEY);

        proofTextView.setText(persistentVariable);


        view.findViewById(R.id.btnPushFragmentB).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getFragmentManager()
                        .beginTransaction()
                        .replace(R.id.frameLayout, new FragmentB())
                        .addToBackStack(null)
                        .commit();
            }
        });

        return view;
    }

    @Override
    public void onPause() {
        super.onPause();
        String persistentVariable = persistentVariableEdit.getText().toString();

        getArguments().putString(PERSISTENT_VARIABLE_BUNDLE_KEY, persistentVariable);
    }
}

দ্বিতীয় তবে কম প্যাডেন্টিক উপায় - সিঙ্গলেটে ভেরিয়েবল ধরে রাখুন

তৃতীয় - পরিবর্তে replace()টুকরো টুকরো না add()/ show()/ hide()সেগুলি।


3
Fragment.onSaveInstanceState()কখনই ডাকা হয়নি তার সেরা সমাধান । তালিকার ভিউ বা কেবল তাদের আইডি (আপনার যদি অন্য কেন্দ্রীয় ডেটা ম্যানেজার থাকে) সহ কেবল যুক্তিগুলিতে নিজের ডেটা সংরক্ষণ করুন। তালিকার দৃশ্যের অবস্থান সংরক্ষণ করার দরকার নেই - যা সংরক্ষণ করা হয়েছিল এবং স্বয়ংক্রিয়ভাবে পুনরুদ্ধার করা হয়েছিল।
জন পাং

আমি আপনার অ্যাপ্লিকেশনটিতে আপনার উদাহরণটি ব্যবহার করার চেষ্টা করেছি, তবে এটি: String persistentVariable = mySavedInstanceState.getString(PERSISTENT_VARIABLE_BUNDLE_KEY);সর্বদা null। সমস্যা কি?
ফ্রেগন

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

আমি প্রথম পদ্ধতির চেষ্টা করেছি কিন্তু এটি আমার পক্ষে কার্যকর হয়নি। getArguments () সর্বদা শূন্য হয়। এটিকেও বোঝা যায় কারণ খণ্ডটি প্রতিস্থাপন করা হয়েছে এবং onCreate () এ আপনি একটি নতুন বান্ডিল সেট করেছেন যাতে পুরাতন বান্ডিলটি হারিয়ে যায়। আমি কী মিস করছি এবং আমি কি ভুল ছিলাম?
জেভি

@ জেভি, আমি এই কোডটি 1,5 বছর আগে লিখেছি এবং সমস্ত বিবরণ মনে রাখে না, তবে যেমনটি আমার মনে আছে, প্রতিস্থাপনগুলি টুকরো পুনরায় তৈরি করবে না, কেবলমাত্র যদি আপনি আপনার কোড থেকে নতুন উদাহরণ তৈরি করেন তবে খণ্ডগুলি পুনরায় তৈরি করা হবে। এই ক্ষেত্রে, স্পষ্টতই, নির্মাণকারী setArguments(new Bundle());পুরানো বান্ডিলকে কল করে ও ওভাররাইট করে। সুতরাং নিশ্চিত হয়ে নিন যে আপনি কেবল একবার খণ্ড তৈরি করেছেন এবং তারপরে প্রতিবার নতুন তৈরি করার পরিবর্তে এই উদাহরণটি ব্যবহার করুন।
ফায়োডর ভোলচিয়োক

20

কেবল লক্ষ্য করুন যে আপনি ভিউপ্যাজার ব্যবহার করে টুকরো টুকরো দিয়ে কাজ করলে এটি বেশ সহজ। আপনি শুধুমাত্র এই পদ্ধতি কল করা প্রয়োজন: setOffscreenPageLimit()

দস্তাবেজের সাথে চুক্তি করুন:

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

অনুরূপ ইস্যু এখানে


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

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

ধন্যবাদ, আমাকেও সাহায্য করেছেন।
এলিজা

বছর পরে এবং এটি এখনও এত প্রাসঙ্গিক। যদিও এটি সত্যই প্রশ্নের উত্তর দেয় না, এটি একটি সমস্যার সমাধান করে
সুপ্রিম ডলফিন

19

একবারে আপনার দৃশ্যে স্ফীত করুন।

উদাহরণ অনুসরণ করুন:

public class AFragment extends Fragment {

private View mRootView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if(mRootView==null){
        mRootView = inflater.inflate(R.id.fragment_a, container, false);
        //......
    }
    return mRootView;
}

}


এছাড়াও বিদ্যমান টুকরাগুলিকে অ্যারে বা অন্য
আমির

আমি শুনেছি যে কোনও খণ্ডের রুটভিউয়ের রেফারেন্স রাখা খারাপ অভ্যাস - এটি ফাঁস হতে পারে [উদ্ধৃতি প্রয়োজন]?
জিরাফ.guru

1
@ জিরাফ.guru Fragmentএর মূল দৃষ্টিভঙ্গি উল্লেখ করে এটি এটি করবে না। কিছু জিসি-রুট উপাদানগুলির রেফারেন্স হিসাবে , বৈশ্বিক স্থিত সম্পত্তি যেমন নন-ইউআই থ্রেড ভেরিয়েবল হবে। একটি Fragmentউদাহরণ জিসি-রুট নয়, সুতরাং এটি আবর্জনা সংগ্রহ করা যেতে পারে। সুতরাং এর রুট ভিউ হবে।
লিম জোয়

আপনি আমার দিন একই।
বিজেন্দ্র পাটিদার

মিষ্টি এবং সহজ।
রূপম দাস

8

আমি এর সাথে খুব মিলে একটি ইস্যু নিয়ে কাজ করেছি। যেহেতু আমি ঘন ঘন একটি পূর্ববর্তী টুকরা ফিরে ফিরে যাবে জানতাম, আমি দেখতে টুকরা কিনা চেক করা .isAdded()সত্য ছিল, এবং যদি তাই হয়, বরং একটি করছেন চেয়ে transaction.replace()আমি শুধু একটি না transaction.show()। এটি খণ্ডটিকে পুনরায় তৈরি করা থেকে বিরত রাখে যদি এটি ইতিমধ্যে স্ট্যাকে থাকে - কোনও রাষ্ট্রীয় সংরক্ষণের প্রয়োজন নেই।

Fragment target = <my fragment>;
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
if(target.isAdded()) {
    transaction.show(target);
} else {
    transaction.addToBackStack(button_id + "stack_item");
    transaction.replace(R.id.page_fragment, target);
}
transaction.commit();

আরেকটি বিষয় মনে রাখবেন যে এটি নিজেরাই টুকরো টুকরো জন্য প্রাকৃতিক ক্রম সংরক্ষণ করে, তবুও আপনাকে ক্রিয়াকলাপটি নিজেই ধ্বংস হওয়া এবং ওরিয়েন্টেশন (কনফিগারেশন) পরিবর্তনে পুনরায় তৈরি করার প্রয়োজন হতে পারে। আপনার নোডের জন্য এন্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল এ সম্পর্কে জানার জন্য:

android:configChanges="orientation|screenSize"

অ্যান্ড্রয়েড 3.0.০ এবং উচ্চতর ক্ষেত্রে, screenSizeস্পষ্টতই প্রয়োজনীয়।

শুভকামনা


লেনদেন.এডডিটোব্যাকস্ট্যাক (বোতাম_আইডি + "স্ট্যাক_াইটেম"); // এই লাইনটি কী করে? এখানে বোতাম_ইড কী?
raghu_3

বাটন_আইডি একটি তৈরি আপ পরিবর্তনশীল up অ্যাডটোব্যাকস্ট্যাকের কাছে স্ট্রিং আর্গুমেন্টটি ব্যাকস্ট্যাকের অবস্থার জন্য কেবল একটি nameচ্ছিক নাম - আপনি যদি কেবল একটি একক ব্যাকস্ট্যাক পরিচালনা করে থাকেন তবে আপনি এটিকে বাতিল করতে পারবেন।
rmirabelle

আমি একটি বিষয় টুকরা সঙ্গে এই অনুরূপ করতে হচ্ছে না, আপনি it- দেখব খুশি stackoverflow.com/questions/22468977/...
raghu_3

1
কখনও android:configChanges=everythinYouCanThinkOf|moreThingsYouFoundOnTheInternetsআপনার ম্যানিফেস্টে যোগ করবেন না । পরিবর্তে কীভাবে রাষ্ট্রকে সংরক্ষণ এবং পুনরুদ্ধার করবেন তা শিখুন, উদাহরণস্বরূপ এখান থেকে: স্পিকারডেক.com
মার্সিন কোজিস্কি

এবং তারপরে আপনি একবার শিখেছেন যে কীভাবে অপ্রতিরোধ্য সাশ্রয়ী রাষ্ট্রটি রয়েছে এবং উপস্থাপিত সমাধানটি আপনার নির্দিষ্ট পরিস্থিতিতে সবচেয়ে পরিষ্কারভাবে সমস্যার সমাধান করে, এগিয়ে যান এবং এটি ব্যবহার করুন, যারা অসম্মতিপূর্ণ লোকদের কাছ থেকে উদ্বেগ ছাড়াই ;-)
rmirabelle

5

আমার পাওয়া সেরা সমাধানটি নীচে রয়েছে:

onSavedInstanceState (): ক্রিয়াকলাপ বন্ধ হয়ে যাওয়ার সময় সর্বদা খণ্ডের ভিতরে ডাকা হয় (ক্রিয়াকলাপের এক থেকে অন্যটিতে সরান বা কনফিগার পরিবর্তনগুলি)। সুতরাং যদি আমরা একই ক্রিয়াকলাপে একাধিক টুকরো কল করি তবে আমাদের নীচের পদ্ধতিটি ব্যবহার করতে হবে:

টুকরাটির অনডেস্ট্রয়ভিউ () ব্যবহার করুন এবং সেই পদ্ধতির অভ্যন্তরে পুরো বস্তুটি সংরক্ষণ করুন। তারপরে OnActivityCreated (): পরীক্ষা করুন যে বস্তুটি শূন্য কিনা বা না (কারণ এই পদ্ধতিটি প্রতিবার কল করে)। এখন এখানে একটি বস্তুর অবস্থা পুনরুদ্ধার করুন।

এটি সর্বদা কাজ করে!


4

যদি আপনি এই জাতীয় অ্যান্ড্রয়েড ম্যানিফেস্টে নির্দিষ্ট করে দেওয়া আপনার খণ্ড ক্রিয়াকলাপে কনফিগার পরিবর্তনগুলি পরিচালনা করছেন

<activity
    android:name=".courses.posts.EditPostActivity"
    android:configChanges="keyboardHidden|orientation"
    android:screenOrientation="unspecified" />

তারপরে onSaveInstanceStateখণ্ডটির অংশটি চাওয়া হবে না এবং savedInstanceStateঅবজেক্টটি সর্বদা শূন্য থাকবে।


1

আমি মনে করি না onSaveInstanceStateএটি একটি ভাল সমাধান। এটি কেবল নির্ধারিত কার্যকলাপের জন্য ব্যবহার করে।

অ্যান্ড্রয়েড 3.0.০ থেকে ফ্রেগম্যান ফ্র্যাগমেন্টম্যানেজার দ্বারা পরিচালক হিসাবে পরিচালিত হয়েছে, শর্তটি হ'ল: ব্যাকস্ট্যাকে টুকরোটি যোগ করা হলে (প্রতিস্থাপন করা হবে না: এটি পুনরায় তৈরি করা হবে) ম্যানি টুকরা ম্যাপিং করার জন্য একটি ক্রিয়াকলাপটি প্রদর্শন করা হবে না। যখন সর্বশেষে ফিরে আসে, এটি আগের মতো প্রদর্শিত হবে।

সুতরাং আমি মনে করি যে খণ্ডটি ম্যানেজার এবং লেনদেন এটিকে পরিচালনা করার পক্ষে যথেষ্ট ভাল।


0

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

public void addFragment(Fragment currentFragment, Fragment targetFragment, String tag) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.setCustomAnimations(0,0,0,0);
    transaction.hide(currentFragment);
    // use a fragment tag, so that later on we can find the currently displayed fragment
    transaction.add(R.id.frame_layout, targetFragment, tag)
            .addToBackStack(tag)
            .commit();
}

যখনই কোনও তালিকা আইটেম ক্লিক করা / আলতো চাপানো হয় (এবং এভাবে আমার বিবরণ খণ্ডটি প্রদর্শন / প্রদর্শন করা প্রয়োজন) আমি এই পদ্ধতিটি আমার টুকরোটিতে (তালিকার ভিউযুক্ত) ব্যবহার করি:

FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
SearchFragment currentFragment = (SearchFragment) fragmentManager.findFragmentByTag(getFragmentTags()[0]);
DetailsFragment detailsFragment = DetailsFragment.newInstance("some object containing some details");
((MainActivity) getActivity()).addFragment(currentFragment, detailsFragment, "Details");

getFragmentTags()আমি যখন একটি নতুন টুকরো যোগ করি তখন আমি বিভিন্ন টুকরো জন্য ট্যাগ হিসাবে ব্যবহার করি এমন স্ট্রিংগুলির একটি অ্যারে প্রদান করে ( উপরের পদ্ধতিতে transaction.addপদ্ধতিটি দেখুন addFragment)।

তালিকার ভিউযুক্ত ভগ্নাংশে, আমি এটির অনপেজ () পদ্ধতিতে এটি করি:

@Override
public void onPause() {
    // keep the list view's state in memory ("save" it) 
    // before adding a new fragment or replacing current fragment with a new one
    ListView lv =  (ListView) getActivity().findViewById(R.id.listView);
    mListViewState = lv.onSaveInstanceState();
    super.onPause();
}

তারপরে খণ্ডটির অনক্রিটভিউতে (আসলে এমন পদ্ধতিতে যা অনক্রিটভিউতে অনুরোধ করা হয়), আমি রাষ্ট্রটি পুনরুদ্ধার করি:

// Restore previous state (including selected item index and scroll position)
if(mListViewState != null) {
    Log.d(TAG, "Restoring the listview's state.");
    lv.onRestoreInstanceState(mListViewState);
}

0

শেষ পর্যন্ত এই জটিল সমাধানগুলির অনেকগুলি চেষ্টা করার পরে আমার কেবলমাত্র আমার ফ্রেগমেন্টে (একটি সম্পাদনা পাঠের সামগ্রী) একক মান সংরক্ষণ / পুনরুদ্ধার করা দরকার ছিল, এবং যদিও এটি সবচেয়ে মার্জিত সমাধান নাও হতে পারে, একটি অংশীদারিত্ব তৈরি করে এবং আমার রাজ্য সংরক্ষণ করে সেখানে আমার জন্য কাজ


0

কোনও ক্রিয়াকলাপে ক্ষেত্রের মান বিভিন্ন ভাগে রেখে দেওয়ার একটি সহজ উপায়

খণ্ডগুলির উদাহরণ তৈরি করুন এবং প্রতিস্থাপন এবং অপসারণের পরিবর্তে যুক্ত করুন

    FragA  fa= new FragA();
    FragB  fb= new FragB();
    FragC  fc= new FragB();
    fragmentManager = getSupportFragmentManager();
    fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.fragmnt_container, fa);
    fragmentTransaction.add(R.id.fragmnt_container, fb);
    fragmentTransaction.add(R.id.fragmnt_container, fc);
    fragmentTransaction.show(fa);
    fragmentTransaction.hide(fb);
    fragmentTransaction.hide(fc);
    fragmentTransaction.commit();

তারপরে সেগুলি আবার যুক্ত করার এবং অপসারণের পরিবর্তে কেবল টুকরোগুলি দেখান এবং লুকান hide

    fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.hide(fa);
    fragmentTransaction.show(fb);
    fragmentTransaction.hide(fc);
    fragmentTransaction.commit()

;


-1
private ViewPager viewPager;
viewPager = (ViewPager) findViewById(R.id.pager);
mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(mAdapter);
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            // on changing the page
            // make respected tab selected
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    // on tab selected
    // show respected fragment view
    viewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}

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