ফ্রেগমেন্টপাগারএডাপ্টার ব্যবহার করে ভিউপ্যাজারে টুকরাটি দ্বিতীয়বার দেখা হওয়ার পরে ফাঁকা


99

আমার নীচে বরাবর ট্যাবগুলি সহ একটি টুকরো ইন্টারফেস রয়েছে যা মূল দৃশ্যে বিভিন্ন টুকরো টুকরো করে।

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

আইটেমগুলি প্রদর্শন করতে ভিউপ্যাজার একটি ফ্র্যাগমেন্টপেজার অ্যাডাপ্টার ব্যবহার করে।

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

কেন ভিউপ্যাজারটি কেবল প্রথমবার উপস্থিত হবে?

FragmentPagerAdapter:

public class ViewPagerAdapter extends FragmentPagerAdapter {
    Cursor mCursor;

    public ViewPagerAdapter(FragmentManager fm, Cursor c) {
        super(fm);
        mCursor = c;
    }

    public void changeCursor(Cursor c) {
        mCursor = c;
        this.notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        if (mCursor == null) return 0;
        else return mCursor.getCount();
    }

    @Override
    public Fragment getItem(int position) {
        mCursor.moveToPosition(position);
        return TeamCardFragment.newInstance(mCursor, position);
    }
}

PagerFragment:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Bundle bundle = getArguments();
    mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION);

    View mView = inflater.inflate(R.layout.team_card_master, container, false);
    mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);

    mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor);
    new setAdapterTask().execute();

    return mView;
}

private class setAdapterTask extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void... params) {
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        mViewPager.setAdapter(mAdapter);
        mViewPager.setCurrentItem(mCursorPosition);
    }
}

উত্তর:


222

আমারও একই প্রশ্ন ছিল. "দ্বিতীয়বার" আমার ডিসপ্লে ইস্যু সমাধান android.support.v4.app.FragmentPagerAdapterকরতে আমার পেজএডাপ্টারের পিতামাতার ক্লাসটি পরিবর্তন করা !android.support.v4.app.FragmentStatePagerAdapterViewPager


4
দুষ্টুমি করসি না? আমার কাছে এই কোডটি আর নেই, অন্যথায় আমি এটি পরীক্ষা করে দেখি। সম্ভবত এই উত্তর অন্য কাউকে সাহায্য করবে।
হোয়েটল

10
কি মানুষ! আমি কয়েক দিনের জন্য এই সমাধানের সন্ধানে ছিলাম! ধন্যবাদ একটি টন মানুষ, একটি কবজ মত কাজ করে। তবে আমার মধ্যে বিকাশকারী জিজ্ঞাসা করছেন যে পরিবর্তনটি কী প্রভাব ফেলে? আমি বলতে চাইছি কেন এটি আগে কাজ করেনি এবং কেন স্টেটপেজার অ্যাডাপ্টারে
আনন্দ সাইনাথ

4
এছাড়াও আপনাকে @ সার্বজনীন ইন গেট আইটেম পজিশন (অবজেক্ট অবজেক্ট) ver পিওসিটিশন_নোনকে ফেরত পাঠাতে হবে; }
হেলিন ওয়াং

4
আমার জন্যও কাজ করেছেন। এখানে একটি লিঙ্ক দেওয়া আছে। এটি খণ্ডের রাজ্যটি সংরক্ষণ করে মনে হচ্ছে, যা সমস্ত পার্থক্য করে। বিকাশকারী.অ্যান্ড্রয়েড.
com

4
এটি এটি একটি কাকতালীয় ঘটনা, সঠিক উত্তরটি হ'ল ড্যানিয়েল এফ এর একটি। যাইহোক, এখানে মন্তব্যকারীদের সুবিধার জন্য, এর মধ্যে পার্থক্য রয়েছে FragmentPagerAdapterএবং FragmentStatePagerAdapterপ্রাক্তনটি কয়েকটি পৃষ্ঠাগুলির জন্য বেশি উপযুক্ত, এটি পৃষ্ঠার স্যুইচটিতে সেরা পারফরম্যান্সের সাথে স্মৃতিতে সমস্ত টুকরো টিকিয়ে রাখে, তবে পরবর্তীকালে অনেকগুলি জন্য আরও উপযুক্ত পৃষ্ঠাগুলি, এটি কেবলমাত্র তাদের স্থিতি রেখে টুকরো টুকরো টুকরো টুকরো করে দেয়, এটি মেমরির আরও দক্ষ তবে পৃষ্ঠা স্যুইচটিতে কিছুটা ধীর switch
ক্রিশ্চিনা ডি রিতো

88

আমি প্যারেন্ট টুকরা getFragmentManager()দিয়ে প্রতিস্থাপন করে এটি সমাধান করতে পরিচালিত getChildFragmentManager()। এই প্যারেন্ট টুকরাটি পেজযোগ্য (স্লাইডেবল) টুকরোগুলি রাখার জন্য একটি android.support.v4.app.FraamentPagerAdapter ইনস্ট্যান্স করছিল , যার জন্য কনস্ট্রাক্টরে একটি খণ্ড ব্যবস্থাপক প্রয়োজন। এই কনস্ট্রাক্টরের কাছে আমি এর রিটার্ন মানটি পাস করেছি getChildFragmentManager()

কী hackbod লিঙ্ক ছিল ( https://developer.android.com/about/versions/android-4.2.html#NestedFragments ), যা এই পোস্টে পাওয়া যায়নি টুকরা মধ্যে টুকরা

কোনও খণ্ডকে বাসা বাঁধার জন্য, কেবলমাত্র getChildFragmentManager()সেই খণ্ডটিতে কল করুন যাতে আপনি একটি খণ্ড যুক্ত করতে চান। এটি এমন একটি ফ্রেগমেন্ট ম্যানেজারকে ফিরিয়ে দেয় যা আপনি সাধারণত ভাগ হিসাবে লেনদেন তৈরি করতে শীর্ষ-স্তরের কার্যকলাপ থেকে আপনার মতো ব্যবহার করতে পারেন।


থানকিউ ... আমি অনার্সিউমের পরে স্লাইডিং ট্যাবগুলির ভিউটি পুনঃপ্রতিষ্ঠিত করার চেষ্টা করছিলাম একই ধরণের সমস্যাটি ছিল () এতে ফ্রেগমেন্টপ্রেডাপ্টার রয়েছে ... আমি যে টিউটোরিয়ালটি ব্যবহার করেছি তা ২০১ 2016 সালের ছিল এবং এটি পেতে এটির জন্য এখনও আমি এটি টুকরো টুকরো পৃষ্ঠায় পরিবর্তন করতে হবে কাজ। আমি কেন জানি।
Nerdy Bunz

এই উত্তরটি আমার অনেক সময় সাশ্রয় করেছে। কারণ কেবলমাত্র এখানে ব্যবহার করা FragmentStatePagerAdapterপ্রশ্নটি সমাধান করে না। বরাবর FragmentStatePagerAdapterপিতা বা মাতা মধ্যে টুকরা YourAdapter adapter = new YourAdapter (getChildFragmentManager()); জুড়তে হবে
MMK

17

আমার জন্য আমার ভিউপেজারে এই কল করতে হয়েছিল:

myViewPager.setSaveFromParentEnabled(false);

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


4
বিশ্বে কেন এই কাজ করলেন? এটি আমার সমস্যাটি স্থির করেছে তবে কেন আমার কোনও ধারণা নেই।
ক্লেহিরেনডিন

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

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

আপনি কি সর্বশেষ সমর্থন গ্রন্থাগারটি ব্যবহার করছেন
j2emanue

4
গত 2 দিন থেকে আমি একই সমস্যার মুখোমুখি হয়েছি .. আপনার সমাধানটি আমার পক্ষে কাজ করেছে। ধন্যবাদ!
ব্রিজেএক্সন

11

আমার খুব বিশেষ ক্ষেত্রে, যেখানে আমি একটি AppBarLayout এবং ভিউপিজার সহ একটি সমন্বয়কারী লেআউট ব্যবহার করছিলাম, আমার জন্য এটি কী সমাধান করেছিল তা আমার অ্যান্ড্রয়েড অপসারণ করছিল : ফিটসিসটেম উইন্ডোস = "সত্য" আমার অ্যাপবারআলআউট এক্সটিএমএল বৈশিষ্ট্য থেকে

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


4
ওহ মানুষ ... আমি এই সমস্যাটি নিয়ে প্রায় আত্মসমর্পণ করছিলাম। আপনি আমার উদ্ভট দিন তৈরি! গীজ গুগল, ডব্লিউটিএফ অ্যাপবারলয়েউটের সাথে ভুল? আমি প্রায় শতাধিক পৃষ্ঠাগুলি দেখেছি এবং ভাগ্য ছাড়াই এই সমস্যাটি সমাধানের চেষ্টা করতে কয়েক ঘন্টা কাটিয়েছি ug আমি সত্যিই কৃতজ্ঞ যে আমি শেষ পর্যন্ত আপনার মন্তব্য দিয়ে সমস্যাটি সমাধান করতে পেরেছি। অনেক ধন্যবাদ! পিএস: আমি এতটাই মরিয়া হয়ে গিয়েছিলাম যে আমি এওএসপিতেও একটি সমস্যা তৈরি করেছি: কোড. google.google.com/p/android/issues/… এক্সডি
গুইলেম রোকা

ইঙ্গিতটির জন্য ধন্যবাদ। কমপক্ষে এটি সমস্যা সমাধানে আমাদের সহায়তা করেছে। এখন আমরা এটির পূর্ণ স্ক্রিন তৈরির জন্য বিকল্পটি অনুসন্ধান করার চেষ্টা করছি
পরেশ মায়ানী

তুমি একজন জীবন রক্ষাকারী! কেন আমি এই সমস্যাটি নিয়ে আসছিলাম এবং আমি কেন এটি কাজ করছিলাম তা এখনও নির্বোধ ছিলাম!
নন্দু

10

আমি একই সমস্যা যার জন্য আমি থেকে অ্যাডাপ্টারের পরিবর্তিত ছিল FragmentPagerAdapterথেকে FragmentStatePagerAdapterএবংgetFragmentManager() পেরেন্টকে টুকরা মধ্যেgetChildFragmentManager()

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


4

করা চেষ্টাসব setOffscreenPageLimit (int limit)উপর পিতা বা মাতা ViewPager।

mViewPager.setOffscreenPageLimit(totalPages-1);

এটি আমার জন্য কবজির মতো কাজ করেছিল।

আমার ক্ষেত্রে আমি টুকরা ভিতরে ছিল TabLayoutসঙ্গেViewPager.

এবং অন্য এক ViewPagerটুকরা ভিতরে। প্রথমবার সব ঠিকঠাক কাজ করছে তবে আমি যখন ট্যাব পরিবর্তন করি এবং ফিরে আসি, তখন আমার কিছু অংশ খালি হয়ে যায়।


4
ভাল উত্তর. এটা আমার সাহায্য করা হয়।
তিরুমালওয়ালভান


1

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


আপনি ভিউফ্রোমঅবজেক্ট (ভিউ দেখুন, অবজেক্ট অবজেক্ট) ফাংশনটি সরিয়ে দেওয়ার চেষ্টা করতে পারেন
মিনা সামি

আরও একটি ভাল উপায় থাকতে হবে ....: / যদিও আমি অ্যান্ড্রয়েডে যত বেশি খনন করি ততই পরিপক্ক আমি বুঝতে পারি।
00 এ স্ট্যাক ওভারফ্লো হয়েছে

4
নেস্টেড টুকরোগুলি সমর্থিত নয় , তাই স্ট্যান্ডার্ড ভিউয়ের সাথে পুনরায় বাস্তবায়ন করা ভাল উপায় বলে মনে হচ্ছে।
Sylphe

আমি একই সমস্যা নিয়ে লড়াই করছি ling আমি ফ্রেগমেন্টএডাপ্টারের পরিবর্তে পেজারআডাপ্টার ব্যবহার করার চেষ্টা করেছি এখনও আমি একই সমস্যার মুখোমুখি হই। আমাকে সাহায্য করুন !
গৌরব অরোরা

: আপনি নেস্টেড টুকরা ব্যবহার করতে চান তাহলে আপনি অ্যাডাপ্টারের আমি এই উত্তর দেওয়া ব্যবহার করতে পারেন stackoverflow.com/questions/7700226/...
Slickelito

1

আমি দ্বিতীয়বারের মতো একটি ফাঁকা স্ক্রিন সহ জামারিন অ্যান্ড্রয়েডে একই সমস্যাটি পেয়ে যাচ্ছিলাম .. নীচের সেটটি আমার জন্য এটি ঠিক করে দিয়েছে।

viewPager.SaveFromParentEnabled = false;

0

আপনার অ্যাপ্লিকেশনকে ছোট করা এবং পরে কল করা হলে আপনি এই ত্রুটিটি অনুভব করেন এমন ক্ষেত্রে অ্যাডাপ্টার শুরু করতে পারেন।

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Bundle bundle = getArguments();
    mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION);
    View mView = inflater.inflate(R.layout.team_card_master, container, false);
    mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);
    initViewPagerAdapter();
    return mView;
}
private void initViewPagerAdapter(){
    mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor);
    new setAdapterTask().execute();
}

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

0

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


0

পরিবর্তন FragmentPagerAdapterমধ্যে FragmentStatePagerAdapter ব্যবহারের getChildFragmentManager()পরিবর্তেgetFragmentManager()

getChildFragmentManager()- কারণ ডকুমেন্টেশন অনুসারে, এটি এই খণ্ডটির অভ্যন্তরে টুকরোগুলি স্থাপন এবং পরিচালনা করার জন্য একটি প্রাইভেট ফ্র্যাগমেন্টম্যানেজার ফিরিয়ে দেবে। এদিকে getFragmentManager()এই ক্রিয়াকলাপের সাথে যুক্ত টুকরাগুলির সাথে ইন্টারঅ্যাক্ট করার জন্য ফ্র্যাগমেন্টম্যানেজারটি ফিরিয়ে দেবে


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