সমর্থন ফ্রেগমেন্টপেজারএডাপ্টার পুরানো টুকরাগুলির রেফারেন্স ধারণ করে


109

সর্বশেষ তথ্য:

পুরানো টুকরো টুকরো টুকরো টুকরো টুকরো করে রাখা এবং আমার ভিউজিয়ারটি আমার ফ্রেগমেন্টম্যানেজারের সাথে সিঙ্কের বাইরে না থাকায় আমি আমার সমস্যাটিকে সংকীর্ণ করেছি। এই সমস্যাটি দেখুন ... http://code.google.com/p/android/issues/detail?id=19211#makechanges । এটি সমাধান করার উপায় সম্পর্কে আমার এখনও কোন ধারণা নেই ue কোনও পরামর্শ...

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

List<Fragment> fragments = new Vector<Fragment>();
fragments.add(Fragment.instantiate(this, Fragment1.class.getName())); 
...
new PagerAdapter(getSupportFragmentManager(), fragments);

বাস্তবায়ন মানসম্মত। আমি টুকরোগুলির জন্য অ্যাকশনবারারলক এবং v4 সংযোগযোগ্যতা গ্রন্থাগার ব্যবহার করছি।

আমার সমস্যাটি হ'ল অ্যাপটি ছাড়ার পরে এবং আরও বেশ কয়েকটি অ্যাপ্লিকেশন খোলার পরে এবং ফিরে আসার পরে টুকরো টুকরোটি ফ্রেগমেন্টএকটিভিটির (যেমন। getActivity() == null) ফিরে পাওয়া যায় । কেন ঘটছে তা আমি বুঝতে পারি না। আমি ম্যানুয়ালি সেট করার চেষ্টা করেছি setRetainInstance(true);কিন্তু এটি কোনও উপকার করে না। আমি অনুভব করেছি যে আমার ফ্রেগমেন্ট অ্যাক্টিভিটি নষ্ট হয়ে গেলে এটি ঘটে, তবে লগ বার্তা পাওয়ার আগে আমি অ্যাপটি খোলার পরেও এটি ঘটে। কোন ধারণা আছে?

@Override
protected void onDestroy(){
    Log.w(TAG, "DESTROYDESTROYDESTROYDESTROYDESTROYDESTROYDESTROY");
    super.onDestroy();
}

অ্যাডাপ্টার:

public class PagerAdapter extends FragmentPagerAdapter {
    private List<Fragment> fragments;

    public PagerAdapter(FragmentManager fm, List<Fragment> fragments) {
        super(fm);

        this.fragments = fragments;

    }

    @Override
    public Fragment getItem(int position) {

        return this.fragments.get(position);

    }

    @Override
    public int getCount() {

        return this.fragments.size();

    }

}

আমার একটি টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টানা

public class MyFragment extends Fragment implements MyFragmentInterface, OnScrollListener {
...

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    handler = new Handler();    
    setHasOptionsMenu(true);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    Log.w(TAG,"ATTACHATTACHATTACHATTACHATTACH");
    context = activity;
    if(context== null){
        Log.e("IS NULL", "NULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULL");
    }else{
        Log.d("IS NOT NULL", "NOTNOTNOTNOTNOTNOTNOTNOT");
    }

}

@Override
public void onActivityCreated(Bundle savedState) {
    super.onActivityCreated(savedState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.my_fragment,container, false);

    return v;
}


@Override
public void onResume(){
    super.onResume();
}

private void callService(){
    // do not call another service is already running
    if(startLoad || !canSet) return;
    // set flag
    startLoad = true;
    canSet = false;
    // show the bottom spinner
    addFooter();
    Intent intent = new Intent(context, MyService.class);
    intent.putExtra(MyService.STATUS_RECEIVER, resultReceiver);
    context.startService(intent);
}

private ResultReceiver resultReceiver = new ResultReceiver(null) {
    @Override
    protected void onReceiveResult(int resultCode, final Bundle resultData) {
        boolean isSet = false;
        if(resultData!=null)
        if(resultData.containsKey(MyService.STATUS_FINISHED_GET)){
            if(resultData.getBoolean(MyService.STATUS_FINISHED_GET)){
                removeFooter();
                startLoad = false;
                isSet = true;
            }
        }

        switch(resultCode){
        case MyService.STATUS_FINISHED: 
            stopSpinning();
            break;
        case SyncService.STATUS_RUNNING:
            break;
        case SyncService.STATUS_ERROR:
            break;
        }
    }
};

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear();
    inflater.inflate(R.menu.activity, menu);
}

@Override
public void onPause(){
    super.onPause();
}

public void onScroll(AbsListView arg0, int firstVisible, int visibleCount, int totalCount) {
    boolean loadMore = /* maybe add a padding */
        firstVisible + visibleCount >= totalCount;

    boolean away = firstVisible+ visibleCount <= totalCount - visibleCount;

    if(away){
        // startLoad can now be set again
        canSet = true;
    }

    if(loadMore) 

}

public void onScrollStateChanged(AbsListView arg0, int state) {
    switch(state){
    case OnScrollListener.SCROLL_STATE_FLING: 
        adapter.setLoad(false); 
        lastState = OnScrollListener.SCROLL_STATE_FLING;
        break;
    case OnScrollListener.SCROLL_STATE_IDLE: 
        adapter.setLoad(true);
        if(lastState == SCROLL_STATE_FLING){
            // load the images on screen
        }

        lastState = OnScrollListener.SCROLL_STATE_IDLE;
        break;
    case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
        adapter.setLoad(true);
        if(lastState == SCROLL_STATE_FLING){
            // load the images on screen
        }

        lastState = OnScrollListener.SCROLL_STATE_TOUCH_SCROLL;
        break;
    }
}

@Override
public void onDetach(){
    super.onDetach();
    if(this.adapter!=null)
        this.adapter.clearContext();

    Log.w(TAG, "DETACHEDDETACHEDDETACHEDDETACHEDDETACHEDDETACHED");
}

public void update(final int id, String name) {
    if(name!=null){
        getActivity().getSupportActionBar().setTitle(name);
    }

}

}

যখন কোনও ব্যবহারকারী কোনও পৃথক অংশের সাথে ইন্টারঅ্যাক্ট করে এবং getActivity নালার দিকে ফিরে আসে তখন আপডেট পদ্ধতিটি ডাকা হয়। অন্যান্য খণ্ড কল করার পদ্ধতিটি এখানে ...

((MyFragment) pagerAdapter.getItem(1)).update(id, name);

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


27
অ্যান্ড্রয়েডের টুকরোটি চুষে!
হামিদ্রেজা সাদেগে

13
God
শ্বর

উত্তর:


120

আপনি কোনও সমস্যায় পড়ছেন কারণ আপনি নিজের টুকরোটির বাইরে তাত্ক্ষণিক উল্লেখ করছেন এবং রেফারেন্সগুলি বাইরে রাখছেন PagerAdapter.getItem, এবং ভিউপ্যাজারের স্বাধীনভাবে সেগুলি উল্লেখগুলি ব্যবহার করার চেষ্টা করছেন। যেমন সেরাফ বলেছেন, আপনার নিশ্চয়তা রয়েছে যে কোনও অংশটি একটি নির্দিষ্ট সময়ে ভিউপ্যাজারে ইনস্ট্যান্ট করা হয়েছে / যুক্ত করা হয়েছে - এটি একটি বাস্তবায়নের বিশদ হিসাবে বিবেচনা করা উচিত। একটি ভিউপেজার তার পৃষ্ঠাগুলির অলস লোডিংটি করে; ডিফল্টরূপে এটি কেবল বর্তমান পৃষ্ঠাটি এবং একটিতে বাম এবং ডান লোড করে।

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

এখন বিবেচনা করুন যে আপনি কয়েকটি পৃষ্ঠা, খণ্ডগুলি এ, বি এবং সি দেখেছেন আপনি জানেন যে এগুলি খণ্ড পরিচালকের সাথে যুক্ত করা হয়েছে। যেহেতু আপনি ব্যবহার করছেন FragmentPagerAdapterএবং না করছেন FragmentStatePagerAdapter, আপনি অন্যান্য পৃষ্ঠাগুলিতে স্ক্রোল করলে এই টুকরোগুলি এখনও যুক্ত করা হবে (তবে সম্ভাব্য বিচ্ছিন্ন)।

বিবেচনা করুন যে আপনি তারপরে আপনার অ্যাপ্লিকেশনটিকে ব্যাকগ্রাউন্ড করেন এবং তারপরে এটি মারা যায়। যখন আপনি ফিরে আসবেন, অ্যান্ড্রয়েড মনে রাখবেন যে খণ্ডের ব্যবস্থাপকটিতে আপনার কাছে খণ্ড A, B এবং C ছিল এবং সুতরাং এটি আপনার জন্য পুনরায় তৈরি করে এবং সেগুলি যুক্ত করে। যাইহোক, এখন খণ্ড ম্যানেজারের সাথে যুক্ত হওয়াগুলি আপনার ক্রিয়াকলাপে আপনার খণ্ডগুলির তালিকায় নেই।

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

এখন, হারিয়ে যাওয়া ক্রিয়াকলাপ নিয়ে আপনার সমস্যার দিকে ফিরে যান। pagerAdapter.getItem(1)).update(id, name)এই সমস্ত ঘটনার পরে কল করার পরে আপনি আপনার তালিকার সেই খণ্ডটি ফিরিয়ে দেন, যা এখনও খণ্ড ব্যবস্থাপকের সাথে যোগ করা যায়নি , এবং এতে কোনও কার্যকলাপের উল্লেখ নেই। আমি আপনাকে পরামর্শ দিচ্ছি যে আপনার আপডেট পদ্ধতির কিছু ভাগ করা ডেটা স্ট্রাকচার (সম্ভবত কার্যকলাপ দ্বারা পরিচালিত) পরিবর্তন করা উচিত এবং তারপরে আপনি যখন কোনও নির্দিষ্ট পৃষ্ঠায় যান তখন এই আপডেট হওয়া তথ্যের ভিত্তিতে এটি নিজেই আঁকতে পারে।


1
আমি আপনার সমাধানটি পছন্দ করি যেহেতু এটি খুব মার্জিত এবং সম্ভবত আমার কোডটি রিফ্যাক্টর করবে তবে আপনি যেমন বলেছেন যে আমি 100% যুক্তি এবং ডেটা টুকরোটির মধ্যে রাখতে চাইছি। আপনার সমাধানটির প্রয়োজন খুব বেশি প্রয়োজন সমস্ত ডেটা ফ্র্যাগমেন্টএকটিভিটিতে রাখা এবং তারপরে প্রতিটি ফ্রেগমেন্টটি কেবল ডিসপ্লে লজিককে পরিচালনা করতে ব্যবহার করুন। যেমনটি আমি বলেছিলাম যে আমি এটি পছন্দ করি তবে টুকরো টুকরোটির মধ্যে মিথস্ক্রিয়া অত্যন্ত ভারী এবং এটি পরিচালনা করতে বিরক্তিকর হতে পারে। যাইহোক আপনার বিস্তারিত ব্যাখ্যার জন্য আপনাকে ধন্যবাদ। আপনি আমার চেয়ে অনেক ভাল ব্যাখ্যা করেছেন।
মৌরিসি

28
সংক্ষিপ্ত: অ্যাডাপ্টারের বাইরের
কোনও টুকরোটির

2
তাহলে কীভাবে কোনও ক্রিয়াকলাপ উদাহরণস্বরূপ ফ্র্যাগমেন্টপাগারএডাপ্টার অ্যাক্সেস করতে পারে যদি এটি ফ্র্যাগমেন্টপাগারএডাপ্টারটি ইনস্ট্যান্ট করে না? ভবিষ্যতের দৃষ্টান্তগুলি কি কেবল ফ্রেগমেন্টপেজারএডাপ্টার এবং এর সমস্ত খণ্ড খণ্ডকে পুনরুদ্ধার করবে না? টুকরাগুলির মধ্যে যোগাযোগ পরিচালনার জন্য ফ্রেগমেন্ট পেজারএডাপ্টারটি কি সমস্ত খণ্ড ইন্টারফেস প্রয়োগ করতে পারে?
এরিক এইচ।

বিবৃতি "এটির উপর একটি হ্যান্ডেল পাওয়া এটির পক্ষে একটি রেফারেন্স পাওয়াও বেশ কঠিন কারণ এটি একটি ট্যাগ দিয়ে যুক্ত করা হয়েছিল যা আপনার অজানা। এটি নকশার মাধ্যমে; আপনি ভিউ পেজার পরিচালনা করছেন এমন খণ্ডগুলি নিয়ে গণ্ডগোল থেকে নিরুত্সাহিত হন are । " মিথ্যা। এটা কল করে একটি রেফারেন্স প্রাপ্ত করা খুব সহজ instantiateItemএবং আপনি আসলে উচিত তা করতে onCreateআপনার ক্রিয়াকলাপের। : এখানে বিস্তারিত দেখতে stackoverflow.com/questions/14035090/...
morgwai

সাধারণভাবে লোড না করে নিজেকে টুকরো টুকরো টুকরো করে তোলার পক্ষে
মজাদার

108

আমি সহজ সমাধান পেয়েছি যা আমার পক্ষে কাজ করেছিল।

আপনার টুকরোটি অ্যাডাপ্টারটি ফ্রেগমেন্টপাগারএডাপ্টারের পরিবর্তে ফ্রেগমেন্টস্টেটপেজার অ্যাডাপ্টারের প্রসারিত করুন এবং নাল ফেরার জন্য সংরক্ষণের ওভাররাইড পদ্ধতিটি সংরক্ষণ করুন

@Override
public Parcelable saveState()
{
    return null;
}

এটি অ্যান্ড্রয়েডকে খণ্ডগুলি পুনরুদ্ধার থেকে রোধ করে


একদিন পরে আমি আরও একটি ভাল সমাধান পেয়েছি।

setRetainInstance(true)আপনার সমস্ত টুকরো জন্য কল করুন এবং তাদের কোথাও রেফারেন্স সংরক্ষণ করুন। আমি আমার ক্রিয়াকলাপে স্থির পরিবর্তনশীল হিসাবে এটি করেছি, কারণ এটি একক টাস্ক হিসাবে ঘোষিত হয়েছে এবং খণ্ডগুলি সর্বদা একই রকম থাকতে পারে।

এইভাবে অ্যান্ড্রয়েড টুকরোগুলি পুনরায় তৈরি না করে একই উদাহরণগুলি ব্যবহার করে।


4
ধন্যবাদ, ধন্যবাদ, ধন্যবাদ অনেক ধন্যবাদ, মিককে ধন্যবাদ দেওয়ার জন্য আমার কাছে সত্যিকার অর্থে কোনও শব্দ নেই, আমি গত 10 দিন থেকে এই সমস্যাটি তাড়া করেছিলাম এবং অনেকগুলি পদ্ধতি চেষ্টা করেছিলাম

7
টুকরোগুলি এবং / বা ক্রিয়াকলাপগুলির স্থিতিশীল রেফারেন্স রাখা খুব ঝুঁকিপূর্ণ কাজ, কারণ এটি খুব সহজে স্মৃতিশক্তি ফাঁস হতে পারে। অবশ্যই, আপনি যদি সতর্ক হন তবে আপনি যখন খুব বেশি প্রয়োজন হয় না তখন এগুলিকে নালায় রেখে সেটাকে সহজেই পরিচালনা করতে পারেন।
অ্যান্ড্রয়েড বিকাশকারী

এটি আমার পক্ষে কাজ করেছে। অ্যাপ্লিকেশন ক্র্যাশ হয়ে ও রিবুট হওয়ার পরে টুকরা এবং তাদের নিজ নিজ মতামতগুলি তাদের লিঙ্কগুলি রাখে। ধন্যবাদ!
সোজাল

আমি setRetainInstance(true)সাথে ব্যবহার করছি FragmentPagerAdapter। সমস্ত ভাল কাজ করে। তবে আমি যখন ডিভাইসটি ঘোরান, তখন অ্যাডাপ্টারে এখনও টুকরো টুকরো থাকে তবে খণ্ডগুলি প্রদর্শিত হয় না। খণ্ডগুলির জীবনচক্র পদ্ধতিগুলিও বলা হয় না। কেউ সাহায্য করতে পারেন?
জোনাস

1
তুমি আমার দিন বাঁচিয়েছ !!! এই বাগটি এখনও 3 দিনের জন্য অনুসন্ধান করা হয়েছে। আমার একটি ভিউপগার ছিল একটি সিঙ্গল টাস্ক ক্রিয়াকলাপের ভিতরে 2 টুকরা এবং "ক্রিয়াকলাপগুলি না রাখুন" পতাকাটি সক্ষম করে। অনেক ধন্যবাদ!!!!
ম্যাট্রিক্স

29

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

private String getFragmentTag(int pos){
    return "android:switcher:"+R.id.viewpager+":"+pos;
}

তারপরে আমি কেবল fra টুকরোটির জন্য একটি রেফারেন্স পাই এবং আমার যা পছন্দ করা তা করা ...

Fragment f = this.getSupportFragmentManager().findFragmentByTag(getFragmentTag(1));
((MyFragmentInterface) f).update(id, name);
viewPager.setCurrentItem(1, true);

আমার খণ্ডগুলির মধ্যে আমি সেট করে রেখেছি setRetainInstance(false);যাতে আমি নিজেই সেভড ইনস্ট্যান্সস্টেট বান্ডেলে মানগুলি যুক্ত করতে পারি।

@Override
public void onSaveInstanceState(Bundle outState) {
    if(this.my !=null)
        outState.putInt("myId", this.my.getId());

    super.onSaveInstanceState(outState);
}

এবং তারপরে অনক্রিতে আমি সেই কীটি ধরলাম এবং প্রয়োজনীয় হিসাবে খণ্ডের অবস্থা পুনরুদ্ধার করব। একটি সহজ সমাধান যা খুঁজে বের করা শক্ত ছিল (আমার পক্ষে কমপক্ষে)।


আমার মত আপনার মত একটি সমস্যা আছে, তবে আমি আপনার ব্যাখ্যাকে একেবারে কমিয়ে দিচ্ছি না, আপনি আরও বিশদ সরবরাহ করতে পারবেন? আমি তালিকায় টুকরো টুকরো সংরক্ষণ করে থাকা এবং অ্যাডাপ্টার রাখি, তবে আমি যখন সাম্প্রতিক অ্যাপ্লিকেশনগুলি থেকে আমার অ্যাপ্লিকেশনটি পুনরায় শুরু করছি তখন অ্যাপস ক্র্যাশ হয়ে যায় কারণ কিছু বিচ্ছিন্ন অংশ রয়েছে। এখানে সমস্যা হল stackoverflow.com/questions/11631408/...
Georgy Gobozov

3
খণ্ড রেফারেন্সে আপনার 'আমার' কী?
জোশ

আমরা সকলেই জানি এই সমাধানটি ভাল পদ্ধতির নয় তবে এটি FragmentByTagভিউপ্যাজারে ব্যবহার করার সহজতম উপায় ।
ইয়ংজায়ে

এখানে একটি উপায় কিভাবে এক্সেস টুকরা ট্যাগ বরাদ্দ অভ্যন্তরীণ পথ সঙ্গে সামঞ্জস্য উপর নির্ভর না করেই: stackoverflow.com/questions/14035090/...
morgwai

26

গ্লোবাল ওয়ার্কিং পরীক্ষিত সমাধান।

getSupportFragmentManager()কিছু সময় নাল রেফারেন্স রাখে এবং প্যাজার দেখুনটি নতুন তৈরি করে না কারণ এটি একই খণ্ডটির রেফারেন্স খুঁজে পায়। সুতরাং এই ব্যবহারটি getChildFragmentManager()সহজ উপায়ে সমস্যার সমাধান করে।

এটি করবেন না:

new PagerAdapter(getSupportFragmentManager(), fragments);

এটা কর:

new PagerAdapter(getChildFragmentManager() , fragments);


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

খুব সুনির্দিষ্ট হ্যাক ব্যবহার না করেই আমার সমস্যা সমাধান করুন। ধন্যবাদ! আমার কোটলিন সংস্করণটি দেখার FragmentStatePagerAdapter(activity!!.supportFragmentManager)জন্য সহজ থেকে পরিণত হয়েছে FragmentStatePagerAdapter(childFragmentManager):)
অষ্টম

7

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

public interface UpdateCallback
{
    void update(String name);
}

public class MyActivity extends FragmentActivity implements UpdateCallback
{
    @Override
    public void update(String name)
    {
        getSupportActionBar().setTitle(name);
    }

}

public class MyFragment extends Fragment
{
    private UpdateCallback callback;

    @Override
    public void onAttach(SupportActivity activity)
    {
        super.onAttach(activity);
        callback = (UpdateCallback) activity;
    }

    @Override
    public void onDetach()
    {
        super.onDetach();
        callback = null;
    }

    public void updateActionbar(String name)
    {
        if(callback != null)
            callback.update(name);
    }
}

অবশ্যই কোডটি অন্তর্ভুক্ত করবে ... আমি ইতিমধ্যে এই পদ্ধতিগুলিতে লগ করছি। অন-স্টপকে ফ্র্যাগমেন্টঅ্যাক্টিভিটিতে ডাকা হলে অনডিটাচ বলা হয়। অ্যানটাচকে ফ্র্যাগমেন্টএটিভিটির অনক্রিটের ঠিক আগে ডাকা হয়।
মৌরিসি

হুম আপনাকে ধন্যবাদ তবে সমস্যাটি এখনও অব্যাহত রয়েছে। পরিবর্তে নামটি কলব্যাক করেছিলাম। আমি কি টুকরো টুকরো টুকরো টানতে পারি না? আমার সেবা ও অন্যান্য উপাদানগুলিতে আমার টুকরো টুকরো টুকরো রয়েছে যা ক্রিয়াকলাপের জন্য একটি রেফারেন্স প্রয়োজন। আমার যে সমস্যাটি হচ্ছে তা এড়াতে আমাকে আমার সমস্ত অ্যাপ্লিকেশন যুক্তিকে মূল কার্যকলাপে নিয়ে যেতে হবে। এটি কিছুটা অপ্রয়োজনীয় মনে হয়।
মৌরিসি

ঠিক আছে তাই আমি এটি পুরোপুরি পরীক্ষা করে দেখেছি এবং শিরোনাম পরিবর্তন করার জন্য কলব্যাক ব্যতীত আমার সমস্ত কোড মন্তব্য করেছে। WHEN অ্যাপ্লিকেশনটি প্রথম চালু হয় এবং আমি সেই স্ক্রিনে চলে যাই শিরোনামের নাম পরিবর্তন করা হয় এনপি changed বেশ কয়েকটি অ্যাপ্লিকেশন লোড করার পরে শিরোনাম ফিরে আসার পরে আর পরিবর্তন হয় না। দেখে মনে হচ্ছে কোনও পুরানো ক্রিয়াকলাপের দৃষ্টিতে কলব্যাকটি পাওয়া যাচ্ছে। আমি আর একটি ব্যাখ্যা ভাবতে পারি না
মরিসি

আমি এটিকে ফ্র্যাগমেন্টম্যানেজার এবং এই সমস্যা ... কোড . google.com/p/android/issues/detail?id=19211 এ সমস্যা হিসাবে চিহ্নিত করেছি । এটি কীভাবে সমাধান করা যায় তা সম্পর্কে আমার এখনও কোনও ধারণা নেই
মরিসি

5

ভিউপ্যাজারটি ধ্বংস করার সময় আপনি টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করে ফেলতে পারেন, আমার ক্ষেত্রে, আমি সেগুলি onDestroyView()আমার টুকরোটির উপর থেকে সরিয়েছি :

@Override
public void onDestroyView() {

    if (getChildFragmentManager().getFragments() != null) {
        for (Fragment fragment : getChildFragmentManager().getFragments()) {
            getChildFragmentManager().beginTransaction().remove(fragment).commitAllowingStateLoss();
        }
    }

    super.onDestroyView();
}

ধন্যবাদ, আপনার সমাধান কাজ করে। এটি আবশ্যক যা অ্যাডাপ্টারের ViewPagerউপর ভিত্তি করেও childFragmentManager(নয় fragmentManager)। এছাড়াও আরও একটি বৈকল্পিক কাজ করে: ব্যবহার করবেন না onDestroyView, তবে ViewPagerঅ্যাডাপ্টার তৈরির আগে শিশুদের টুকরো মুছে ফেলুন ।
কুলমাইন্ড

4

অনুরূপ ইস্যুটি অনুসন্ধানের কয়েক ঘন্টা পরে আমার মনে হয় এর আরও একটি সমাধান রয়েছে। এটি অন্তত আমার জন্য কাজ করেছিল এবং আমাকে কেবল কয়েকটি লাইন পরিবর্তন করতে হবে।

আমার এই সমস্যাটি ছিল, আমার কাছে একটি ভিউ পেজারের সাথে একটি ক্রিয়াকলাপ রয়েছে যা দুটি টুকরোগুলি সহ একটি ফ্র্যাগমেন্টস্টেটপেজারএডাপ্টার ব্যবহার করে। যতক্ষণ না আমি ক্রিয়াকলাপটি ধ্বংস হতে বাধ্য করি (বিকাশকারী বিকল্পগুলি) বা আমি পর্দাটি ঘোরান না ત્યાં સુધી সবকিছু ঠিকঠাক কাজ করে। পদ্ধতিটি আইটেমের ভিতরে তৈরি হওয়ার পরে দুটি টুকরো টুকরো করার জন্য আমি একটি রেফারেন্স রাখি।

এই মুহুর্তে ক্রিয়াকলাপটি আবার তৈরি হবে এবং এই মুহুর্তে সবকিছু ঠিকঠাক কাজ করবে তবে গেট আইটেমটি আবার কল করা হবে না বলে আমি আমার টুকরো টুকরোটির রেফারেন্স হারিয়ে ফেলেছি।

ফ্র্যাগমেন্টস্টেটপেজার অ্যাডাপ্টারের অভ্যন্তরে আমি এইভাবে এই সমস্যাটি স্থির করেছি:

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Object aux = super.instantiateItem(container, position);

        //Update the references to the Fragments we have on the view pager
        if(position==0){
            fragTabOne = (FragOffersList)aux;
        }
        else{
            fragTabTwo = (FragOffersList) aux;
        }

        return aux;
    }

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

আশা করি যে কাউকে সাহায্য করবে।


আপনার যদি অনেক টুকরো টুকরো থাকে? আপনি কি তাদের প্রত্যেকের জন্য একটি রেফারেন্স সংরক্ষণ করতে পছন্দ করবেন? স্মৃতিশক্তি কি খারাপ নয়?
অ্যান্ড্রয়েড বিকাশকারী

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

0

যেহেতু ফ্র্যাগমেন্টম্যানেজার আপনার জন্য পুনরায় পুনঃস্থাপনের যত্ন নেবে অনারেসিউম () পদ্ধতিটি বলার সাথে সাথে আমার ক্রিয়াকলাপে খণ্ড খণ্ড কল হবে এবং নিজেকে তালিকায় যুক্ত করব। আমার উদাহরণে আমি আমার পেজারআডাপ্টার বাস্তবায়নে এই সমস্তগুলি সঞ্চয় করছি oring প্রতিটি খণ্ড এটির অবস্থানটি জানে কারণ এটি তৈরির ক্ষেত্রে খণ্ড যুক্তি যুক্ত করা হয়েছে। এখন যখনই আমাকে নির্দিষ্ট সূচীতে কোনও টুকরোটি হস্তান্তর করা দরকার তখন আমাকে যা করতে হবে তা হ'ল আমার অ্যাডাপ্টারের তালিকাটি ব্যবহার করা।

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

এডাপটার

public class GrowPagerAdapter extends FragmentPagerAdapter implements OnPageChangeListener, OnScrollChangedListener {

public final String TAG = this.getClass().getSimpleName();

private final int COUNT = 4;

public static final float BASE_SIZE = 0.8f;
public static final float BASE_ALPHA = 0.8f;

private int mCurrentPage = 0;
private boolean mScrollingLeft;

private List<SummaryTabletFragment> mFragments;

public int getCurrentPage() {
    return mCurrentPage;
}

public void addFragment(SummaryTabletFragment fragment) {
    mFragments.add(fragment.getPosition(), fragment);
}

public GrowPagerAdapter(FragmentManager fm) {
    super(fm);

    mFragments = new ArrayList<SummaryTabletFragment>();
}

@Override
public int getCount() {
    return COUNT;
}

@Override
public Fragment getItem(int position) {
    return SummaryTabletFragment.newInstance(position);
}

@Override
public void onPageScrollStateChanged(int state) {}

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    adjustSize(position, positionOffset);
}

@Override
public void onPageSelected(int position) {
    mCurrentPage = position;
}

/**
 * Used to adjust the size of each view in the viewpager as the user
 * scrolls.  This provides the effect of children scaling down as they
 * are moved out and back to full size as they come into focus.
 * 
 * @param position
 * @param percent
 */
private void adjustSize(int position, float percent) {

    position += (mScrollingLeft ? 1 : 0);
    int secondary = position + (mScrollingLeft ? -1 : 1);
    int tertiary = position + (mScrollingLeft ? 1 : -1);

    float scaleUp = mScrollingLeft ? percent : 1.0f - percent;
    float scaleDown = mScrollingLeft ? 1.0f - percent : percent;

    float percentOut = scaleUp > BASE_ALPHA ? BASE_ALPHA : scaleUp;
    float percentIn = scaleDown > BASE_ALPHA ? BASE_ALPHA : scaleDown;

    if (scaleUp < BASE_SIZE)
        scaleUp = BASE_SIZE;

    if (scaleDown < BASE_SIZE)
        scaleDown = BASE_SIZE;

    // Adjust the fragments that are, or will be, on screen
    SummaryTabletFragment current = (position < mFragments.size()) ? mFragments.get(position) : null;
    SummaryTabletFragment next = (secondary < mFragments.size() && secondary > -1) ? mFragments.get(secondary) : null;
    SummaryTabletFragment afterNext = (tertiary < mFragments.size() && tertiary > -1) ? mFragments.get(tertiary) : null;

    if (current != null && next != null) {

        // Apply the adjustments to each fragment
        current.transitionFragment(percentIn, scaleUp);
        next.transitionFragment(percentOut, scaleDown);

        if (afterNext != null) {
            afterNext.transitionFragment(BASE_ALPHA, BASE_SIZE);
        }
    }
}

@Override
public void onScrollChanged(int l, int t, int oldl, int oldt) {

    // Keep track of which direction we are scrolling
    mScrollingLeft = (oldl - l) < 0;
}
}

টুকরা

public class SummaryTabletFragment extends BaseTabletFragment {

public final String TAG = this.getClass().getSimpleName();

private final float SCALE_SIZE = 0.8f;

private RelativeLayout mBackground, mCover;
private TextView mTitle;
private VerticalTextView mLeft, mRight;

private String mTitleText;
private Integer mColor;

private boolean mInit = false;
private Float mScale, mPercent;

private GrowPagerAdapter mAdapter;
private int mCurrentPosition = 0;

public String getTitleText() {
    return mTitleText;
}

public void setTitleText(String titleText) {
    this.mTitleText = titleText;
}

public static SummaryTabletFragment newInstance(int position) {

    SummaryTabletFragment fragment = new SummaryTabletFragment();
    fragment.setRetainInstance(true);

    Bundle args = new Bundle();
    args.putInt("position", position);
    fragment.setArguments(args);

    return fragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);

    mRoot = inflater.inflate(R.layout.tablet_dummy_view, null);

    setupViews();
    configureView();

    return mRoot;
}

@Override
public void onViewStateRestored(Bundle savedInstanceState) {
    super.onViewStateRestored(savedInstanceState);

    if (savedInstanceState != null) {
        mColor = savedInstanceState.getInt("color", Color.BLACK);
    }

    configureView();
}

@Override
public void onSaveInstanceState(Bundle outState)  {

    outState.putInt("color", mColor);

    super.onSaveInstanceState(outState);
}

@Override
public int getPosition() {
    return getArguments().getInt("position", -1);
}

@Override
public void setPosition(int position) {
    getArguments().putInt("position", position);
}

public void onResume() {
    super.onResume();

    mAdapter = mActivity.getPagerAdapter();
    mAdapter.addFragment(this);
    mCurrentPosition = mAdapter.getCurrentPage();

    if ((getPosition() == (mCurrentPosition + 1) || getPosition() == (mCurrentPosition - 1)) && !mInit) {
        mInit = true;
        transitionFragment(GrowPagerAdapter.BASE_ALPHA, GrowPagerAdapter.BASE_SIZE);
        return;
    }

    if (getPosition() == mCurrentPosition && !mInit) {
        mInit = true;
        transitionFragment(0.00f, 1.0f);
    }
}

private void setupViews() {

    mCover = (RelativeLayout) mRoot.findViewById(R.id.cover);
    mLeft = (VerticalTextView) mRoot.findViewById(R.id.title_left);
    mRight = (VerticalTextView) mRoot.findViewById(R.id.title_right);
    mBackground = (RelativeLayout) mRoot.findViewById(R.id.root);
    mTitle = (TextView) mRoot.findViewById(R.id.title);
}

private void configureView() {

    Fonts.applyPrimaryBoldFont(mLeft, 15);
    Fonts.applyPrimaryBoldFont(mRight, 15);

    float[] size = UiUtils.getScreenMeasurements(mActivity);
    int width = (int) (size[0] * SCALE_SIZE);
    int height = (int) (size[1] * SCALE_SIZE);

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(width, height);
    mBackground.setLayoutParams(params);

    if (mScale != null)
        transitionFragment(mPercent, mScale);

    setRandomBackground();

    setTitleText("Fragment " + getPosition());

    mTitle.setText(getTitleText().toUpperCase());
    mLeft.setText(getTitleText().toUpperCase());
    mRight.setText(getTitleText().toUpperCase());

    mLeft.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            mActivity.showNextPage();
        }
    });

    mRight.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            mActivity.showPrevPage();
        }
    });
}

private void setRandomBackground() {

    if (mColor == null) {
        Random r = new Random();
        mColor = Color.rgb(r.nextInt(255), r.nextInt(255), r.nextInt(255));
    }

    mBackground.setBackgroundColor(mColor);
}

public void transitionFragment(float percent, float scale) {

    this.mScale = scale;
    this.mPercent = percent;

    if (getView() != null && mCover != null) {

        getView().setScaleX(scale);
        getView().setScaleY(scale);

        mCover.setAlpha(percent);
        mCover.setVisibility((percent <= 0.05f) ? View.GONE : View.VISIBLE);
    }
}

@Override
public String getFragmentTitle() {
    return null;
}
}

0

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

আমি জানি এটি মেমরিটি ফাঁস করতে পারে এবং জঞ্জাল নষ্ট করতে পারে, এবং আমার কোড অন্যান্য প্রকল্পের জন্য উপযুক্ত হবে না তবে আমি এ সম্পর্কে ভয় পাচ্ছি না - আমি অ্যাপ্লিকেশনটি বিভিন্ন ডিভাইস এবং শর্তাদি পরীক্ষা করেছি, কোন সমস্যা নেই, অ্যান্ড্রয়েড প্ল্যাটফর্মটি এটিকে পরিচালনা করতে সক্ষম বলে মনে হচ্ছে। ইউআই প্রতি সেকেন্ডে রিফ্রেশ হয় এবং এস 2 আইসিএস (4.0.3) ডিভাইসেও অ্যাপটি হাজার হাজার জিও-মার্কার পরিচালনা করতে সক্ষম হয়।


0

আমি একই সমস্যার মুখোমুখি হয়েছিলাম তবে আমার ভিউপাগারটি একটি টপফ্রেগমেন্টের ভিতরে ছিল যা ব্যবহার করে একটি অ্যাডাপ্টার তৈরি করে এবং সেট করে setAdapter(new FragmentPagerAdapter(getChildFragmentManager()))

আমি এই বিষয়টি onAttachFragment(Fragment childFragment)টপফ্রেমেটে ওভাররাইড করে এই সমস্যার সমাধান করেছি :

@Override
public void onAttachFragment(Fragment childFragment) {
    if (childFragment instanceof OnboardingDiamondsFragment) {
        mChildFragment = (ChildFragment) childFragment;
    }

    super.onAttachFragment(childFragment);
}

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

আশা করি এটি আমার মতো এই পুরাতন কিউ পেতে যে কাউকে সহায়তা করবে :)


0

স্পারসআর্রে খণ্ডগুলি সংরক্ষণ করে আমি সমস্যার সমাধান করেছি:

public abstract class SaveFragmentsPagerAdapter extends FragmentPagerAdapter {

    SparseArray<Fragment> fragments = new SparseArray<>();

    public SaveFragmentsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment fragment = (Fragment) super.instantiateItem(container, position);
        fragments.append(position, fragment);
        return fragment;
    }

    @Nullable
    public Fragment getFragmentByPosition(int position){
        return fragments.get(position);
    }

}

0

ঠিক যেমন তুমি জানো...

এই ক্লাসগুলির সাথে দুর্ভোগের লিটানিতে যুক্ত করা, এটির পরিবর্তে একটি আকর্ষণীয় বাগ রয়েছে যা ভাগ করার মতো।

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

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

আমার পরিষ্কার পরিচ্ছন্নতা নেই। আমি এরকম কিছু ব্যবহার করেছি:

  public void onSaveInstanceState(Bundle outState) {
    IFragmentListener listener = (IFragmentListener)getActivity();
    if (listener!= null)
    {
        if (!listener.isStillInTheAdapter(this.getAdapterItem()))
        {
            return; // return empty state.
        }

    }
    super.onSaveInstanceState(outState);

    // normal saving of state for flips and 
    // paging out of the activity follows
    ....
  }

একটি অপূর্ণ সমাধান কারণ নতুন খণ্ডের উদাহরণটি এখনও একটি সেভস্টেট বান্ডেল পায় তবে কমপক্ষে এটি বাসি ডেটা বহন করে না।


0

যেহেতু লোকেদের মন্তব্য পড়ার ঝোঁক নেই, তাই এখানে একটি উত্তর যা বেশিরভাগই আমি এখানে লিখেছি তা সদৃশ করে :

ইস্যুটির মূল কারণটি হ'ল এন্ড্রয়েড সিস্টেম getItemপ্রকৃত প্রদর্শিত টুকরো টুকরো পাওয়ার জন্য আহ্বান জানায় না , তবে instantiateItem। এই পদ্ধতিটি প্রথমে কোনও প্রদত্ত ট্যাবটি ভিতরে টুকরো টুকরো টুকরোটির জন্য অনুসন্ধান এবং পুনরায় ব্যবহার করার চেষ্টা করে FragmentManager। কেবলমাত্র এই চেহারাটি ব্যর্থ হলে (যা প্রথমবার FragmentManagerনতুনভাবে তৈরি হওয়ার পরে ঘটে ) তখনই getItemতাকে ডাকা হয়। খণ্ডগুলি পুনরায় তৈরি না করা স্পষ্ট কারণগুলির জন্য (এটি ভারী হতে পারে) উদাহরণস্বরূপ যখন প্রতিবার ব্যবহারকারী তার ডিভাইসটি ঘোরান।
এটি সমাধানের জন্য, Fragment.instantiateআপনার ক্রিয়াকলাপে টুকরো টুকরো তৈরি করার পরিবর্তে আপনার এটি করা উচিত pagerAdapter.instantiateItemএবং এই সমস্ত কলগুলি এমন জায়গায় হওয়া উচিত যেখানে খণ্ডগুলি তাদের নিজ নিজ নির্মাণকারীর সাহায্যে তৈরি করা উচিত।startUpdate/finishUpdate যথাযথভাবে কল কল শুরু হওয়া / খণ্ডিত লেনদেন শুরু করে এমন পদ্ধতি কল ।getItem

List<Fragment> fragments = new Vector<Fragment>();

@Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myLayout);
        ViewPager viewPager = (ViewPager) findViewById(R.id.myViewPager);
        MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(adapter);
        ((TabLayout) findViewById(R.id.tabs)).setupWithViewPager(viewPager);

        adapter.startUpdate(viewPager);
        fragments.add(adapter.instantiateItem(viewPager, 0));
        fragments.add(adapter.instantiateItem(viewPager, 1));
        // and so on if you have more tabs...
        adapter.finishUpdate(viewPager);
}

class MyPagerAdapter extends FragmentPagerAdapter {

        public MyPagerAdapter(FragmentManager manager) {super(manager);}

        @Override public int getCount() {return 2;}

        @Override public Fragment getItem(int position) {
            if (position == 0) return new Fragment0();
            if (position == 1) return new Fragment1();
            return null;  // or throw some exception
        }

        @Override public CharSequence getPageTitle(int position) {
            if (position == 0) return getString(R.string.tab0);
            if (position == 1) return getString(R.string.tab1);
            return null;  // or throw some exception
        }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.