টুকরাটি প্রতিস্থাপন করা হচ্ছে না তবে আগেরটির উপরে রাখা হয়েছে


104

কার্যক্রম:

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

Fragment1 fragment = new Fragment1();
Fragment2 fragment2 = new Fragment2();

transaction.replace(R.id.Fragment1, fragment);
transaction.addToBackStack(null);
transaction.commit();

FragmentTransaction transaction2 = getSupportFragmentManager().beginTransaction();
transaction2.replace(R.id.Fragment1, fragment2);
transaction2.addToBackStack(null);
transaction2.commit();

দর্শন কোড:

<fragment
    android:id="@+id/Fragment1"
    android:name="com.landa.fragment.Fragment1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/include1" /> 

সমস্যাটি হ'ল, সামগ্রীটি সত্যই প্রতিস্থাপন হয় না - এটি শীর্ষে ফেলা হয় (যাতে এটি ওভারল্যাপ হয়)।

আমি যখন ফিরে ক্লিক করি তখন প্রথম টুকরাটি সঠিকভাবে প্রদর্শিত হবে (দ্বিতীয়টি ছাড়াই) তবে প্রাথমিকভাবে উভয়ই দৃশ্যমান (আমি চাই কেবলমাত্র শেষটি দৃশ্যমান হোক)।

আমি এখানে কি মিস করছি?


আমার ক্ষেত্রে সমস্যাটি এই কারণে হয়েছিল যে আমি ধারক দৃশ্যের উপযুক্ত আইডি ব্যবহার করছিলাম না, অর্থাৎ আমি সঠিক containerViewId( replaceপদ্ধতিতে) পাস করছিলাম না ।
nbro

উত্তর:


145

আপনি এখানে দুটি জিনিস ভুল করছেন:

  1. কোনও xmlলেআউট ফাইলে স্থিতিশীলভাবে রাখা একটি খণ্ডকে আপনি প্রতিস্থাপন করতে পারবেন না । FrameLayoutআপনার লেআউটে একটি ধারক (উদাহরণস্বরূপ ) তৈরি করা উচিত এবং তারপরে প্রোগ্রামটিমেটিকভাবে ব্যবহার করে খণ্ডটি যুক্ত করা উচিত FragmentTransaction

  2. FragmentTransaction.replaceপ্রথম পরামিতি হিসাবে খণ্ডের আইডি নয় এমন ধারকটির আইডি প্রত্যাশা করে। সুতরাং যে কন্টেইনারটিতে আপনি প্রথম খণ্ড যুক্ত করেছেন তার আইডি হিসাবে আপনার প্রথম যুক্তিটি পাস করা উচিত।

আপনি আরও তথ্যের জন্য এই লিঙ্কটি উল্লেখ করতে পারেন ।


17
FrameLayoutধারক হিসাবে ব্যবহার করা ব্যবহার করার চেয়ে ভাল LinearLayout
মার্সেল ব্রো

3
ক্রিয়াকলাপে একটি খালি ফ্রেমলআউট ব্যবহার করা আমার সমস্যার সমাধানও করেছে
সূক্ষ্ম ফক্স

1
এটি এই কাজ করে। কিন্তু তারপরে আমি যখন আমার অ্যাপ্লিকেশন শুরু করব এবং সঙ্গে সঙ্গে পিছনের বোতামটি টিপব, তখন আমি অ্যাপ্লিকেশনটি ছাড়ার পরিবর্তে খণ্ড খালি অবস্থায় এমন অবস্থায় পৌঁছে যাব?
মাস্টারস্ক্র্যাট

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

এখানে একটি দুর্দান্ত ভিডিও যা আপনার ব্যাখ্যাটি প্রদর্শন করে। youtube.com/watch?v=EbcdMxAIr54
এসকিউএল এবং জাভা লার্নার

32

আমার অনুরূপ সমস্যা ছিল তবে আমার সমস্যাটি হ'ল আমি দুটি পৃথক ফ্র্যাগমেন্ট ম্যানেজার ব্যবহার করছিলাম: একজনের getSupportFragmentManager()এবং একজনের getFragmentManager()। যদি আমি এর সাথে একটি খণ্ড যুক্ত করেছি SupportFragmentManagerএবং তারপরে খণ্ডটি প্রতিস্থাপনের চেষ্টা করেছি FragmentManager, খণ্ডটি কেবল শীর্ষে যুক্ত হবে। আমার কোডটি পরিবর্তন করার দরকার ছিল যাতে একইটি FragmentManagerব্যবহৃত হয় এবং এটি সমস্যার যত্ন নিয়েছিল।


17

অ্যান্ড্রয়েড বিকাশকারী সাইট FrameLayoutরান-টাইমে গতিশীলভাবে টুকরো লোড করতে একটি ব্যবহারের পরামর্শ দেয় of আপনি আপনার এক্সএমএল ফাইলটিতে টুকরাটি হার্ড-কোডড করেছেন। সুতরাং এই লিঙ্কে উল্লিখিত হিসাবে রান-টাইমে এটি সরানো যাবে না:

http://developer.android.com/training/basics/fragments/creating.html

এই লিঙ্কটি দেখায় যে কীভাবে আপনার প্রোগ্রামের মাধ্যমে খণ্ড যুক্ত করা যায়:

http://developer.android.com/training/basics/fragments/fragment-ui.html


7

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

<FrameLayout
    android:id="@+id/fragment_frame_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="....ShopFragment"
        android:id="@+id/fragment"
        tools:layout="@layout/fragment_shop" />
</FrameLayout>

পরে যদিও আমি ক্ষণস্থায়ী ছিল FrameLayoutথেকে fragmentTransaction.replace()কিন্তু আমি সঠিক সমস্যা ছিল। এটি আগেরটির শীর্ষে দ্বিতীয় খণ্ডটি দেখিয়েছিল।

এক্সএমএল থেকে টুকরোটি সরিয়ে এবং প্রোগ্রামটির সূচনাতে onCreate()পূর্বনির্ধারিত পূর্বরূপের জন্য ধারক ক্রিয়াকলাপের পদ্ধতিতে প্রোগ্রামযুক্তভাবে দেখিয়ে সমস্যার সমাধান করা হয়েছে :

    fragmentTransaction = getFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.fragment_frame_layout,new ShopFragment());
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();

এবং ধারক ক্রিয়াকলাপ এক্সএমএল:

<FrameLayout
    android:id="@+id/fragment_frame_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

4

খণ্ডগুলি প্রতিস্থাপনের আগে আপনি ব্যাকস্ট্যাক সাফ করতে পারেন:

    FragmentManager fm = getActivity().getSupportFragmentManager();

    for (int i = 0; i < fm.getBackStackEntryCount(); i++) {
        fm.popBackStack();
    }

    // replace your fragments

সমস্যাটি হ'ল তিনি তার এক্সএমএল লেআউট ফাইলটিতে খণ্ডটি ঘোষণা করেছেন। তাই রান-টাইমে এটি সরানো / প্রতিস্থাপন করা যায় না।
পুনম অ্যান্টনি

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

3
<FrameLayout
    android:id="@+id/fragment_frame_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?android:windowBackground">
//Add fragment here
</FrameLayout>

যোগ android:background="?android:windowBackground">ধারক যা আপনার টুকরা বসবাস করতে। আমার ক্ষেত্রে আমি একটি যুক্ত করেছি FrameLayout, এটির সাহায্য করা উচিত।


1

টুকরা ব্যবহার না করে একটি ধারক ব্যবহার করুন

<FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Hello World!" />

মেইনএ্যাকটিভিটিতে এখন

if(condition)
    getFragmentManager().beginTransaction().replace(R.id.container,new FirstFragment()).commit();                    
else
    getFragmentManager().beginTransaction().replace(R.id.container, new SecondFragment()).commit();

দয়া করে নোট করুন যে আপনার খণ্ড শ্রেণীর 'android.app.Fraament' আমদানি করা উচিত, নিশ্চিত হয়ে নিন যে আপনি "সমর্থন.v4" বা "মূল" বাস্তবায়ন ব্যবহার করেন এবং সেগুলি মেশান না। আমি এই সমস্যাটি পেয়েছিলাম কারণ আমি তাদের মিশ্রিত করেছি।


0

আমি সপন দিবাকরের উত্তরের সাথে একমত তবে এটি কীভাবে করা যায় সে সম্পর্কে আমি একটি কাজের সন্ধান পেয়েছি।

প্রথমে আপনার ক্রিয়াকলাপে (উদাঃ activity_main), যেখানে আপনার সমস্ত লেআউট রয়েছে সেখানে অ্যাড যুক্ত করুন FrameLayout। এর উচ্চতা এবং প্রস্থ হওয়া উচিত match parent। এছাড়াও, এটি একটি দিন id

এখন, আপনার খণ্ডে যা বর্তমান লেআউটটি প্রতিস্থাপন করতে চলেছে, কল onPause()এবং onResume()। অভ্যন্তরের সমস্ত পাত্রে শুরু করুন View। তাদের সেট visibilityকরার GONEমধ্যেonResume() এবং VISIBLEমধ্যেonPause()

দ্রষ্টব্য : FrameLayoutআপনি এই খণ্ডটির সাথে প্রতিস্থাপন করছেন তা নয়।

ধরুন আপনি ViewPager, TabLayout, ImageViewএবং একটি কাস্টম <fragment>মধ্যে activity_main.xmlFrameLayoutউপরে উল্লিখিত হিসাবে একটি যোগ করুন ।

ইন abcFragment.java, ইন onClick()ফাংশন, যোগ addToBackstack(null)মধ্যে transaction

উদাহরণ কোড:

এক্সজিফ্রেগমেন্টে, যা অ্যাবসিফ্রেগমেন্ট (এবং কার্যকলাপ_মাইন.এক্সএমএল এ প্রদর্শিত সমস্ত কিছু) প্রতিস্থাপন করবে, এটি করুন

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

    // On resume, make everything in activity_main invisible except this fragment.
    slidingTabs = getActivity().findViewById(R.id.sliding_tabs);
    viewPager = getActivity().findViewById(R.id.pager);
    miniPlayerFragment = getActivity().findViewById(R.id.mini_pager);

    slidingTabs.setVisibility(View.GONE);
    viewPager.setVisibility(View.GONE);
    miniPlayerFragment.setVisibility(View.GONE);
}

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

    // Make everything visible again
    slidingTabs = getActivity().findViewById(R.id.sliding_tabs);
    viewPager = getActivity().findViewById(R.id.pager);
    miniPlayerFragment = getActivity().findViewById(R.id.mini_pager);

    slidingTabs.setVisibility(View.VISIBLE);
    viewPager.setVisibility(View.VISIBLE);
    miniPlayerFragment.setVisibility(View.VISIBLE);
}

শুভ কোডিং!


0

ওভারল্যাপিং ইস্যুটি ঠিক করতে আপনি ফ্রেগমেন্ট ট্রান্সজিশন থেকে সেট ট্রান্সশন পদ্ধতি ব্যবহার করতে পারেন।

transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

0

অনক্রিয়েটে ()

  BaseFragmentloginpage fragment = new BaseFragmentloginpage();
            android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.frame, fragment);
            fragmentTransaction.isAddToBackStackAllowed();
            fragmentTransaction.commit();

এখন এটি সর্বদা আপনার ডিফল্ট খণ্ডন হবে ... আপনি যদি এক্সএমএল লেআউটে খণ্ড যুক্ত করেন তবে এটি সর্বদা ওভারল্যাপ হয়ে যায়, সুতরাং রান টাইমে খণ্ডের সাথে প্রাথমিক সামগ্রী সেট করুন


0

এই সমস্যাটি সমাধান করার পরেও আমার একই সমস্যা ছিল

  1. আপনি যেখানে ইউআর টুকরা প্রতিস্থাপন করছেন সেখানে ফ্রেম বিন্যাসটি ধরুন

    <FrameLayout
                    android:id="@+id/fragment_place"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" />
  2. এবং প্রতিস্থাপনের জন্য কোড

    public void selectFrag(View view) {
    Fragment fr;
    
      if(view == findViewById(R.id.button2))
    {
         fr = new FragmentTwo();
    
     }else {
         fr = new FragmentOne();
     }
     FragmentManager fm = getFragmentManager();
     FragmentTransaction fragmentTransaction = fm.beginTransaction();
     fragmentTransaction.replace(R.id.fragment_place, fr);
     fragmentTransaction.commit();

আপনি যদি পুরো উদাহরণ চান তবে আমি আপনাকে কেবল আমার মন্তব্য পাঠাব ......


0

আমারও একই সমস্যা ছিল, তবে এটি কারণ যে আমি আমার ফ্রেমলেটে যোগ করার চেষ্টা করছিলাম সেই খণ্ডটির পটভূমির রঙ পরিবর্তন করি নি।

এটি দিয়ে চেষ্টা করুন layout_heightএবং layout_widthসেট করুনmatch_parent


0

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


0

আমি সমস্ত মামলার উপরে চেষ্টা করেছি এবং সমস্যাটি সমাধান করার চেষ্টা করেছি কিন্তু এখনও সমাধান পাইনি not কেন জানি এটি আমার পক্ষে কাজ করছে না। আমি উপরের উত্তরগুলির সাথে একমত, কারণ এর সাথে অনেকেই একমত হন।

আমি কেবল উত্তরটি প্রসারিত করছি এবং নীচে আমার পক্ষে কাজ করছে।

আমি এই সম্পত্তিটি ফাইলের android:clickable="true"শীর্ষ পিতামাতার বিন্যাসে যুক্ত করেছি fragment.xml

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


0

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

কোড:

getSupportFragmentManager().beginTransaction()
                            .replace(R.id.content_group_view, itemDetailFragment).commit();

এক্সএমএল:

 <RelativeLayout
         android:id="@+id/content_group_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent">

 </RelativeLayout>

0

আপনার ফ্রেম বিন্যাস আইডি চেক করুন এবং নীচের হিসাবে এটি প্রতিস্থাপন

fragmentTransactionChange = MainActivity.this.getSupportFragmentManager().beginTransaction();
fragmentTransactionChange.replace(R.id.progileframe, changeFragment);
fragmentTransactionChange.addToBackStack(null);
fragmentTransactionChange.commit();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.