ক্রিয়াকলাপ দলের অভ্যন্তরে অন্য একটি খণ্ডের সাথে একটি খণ্ডকে প্রতিস্থাপন


137

আমার একটি গোষ্ঠী ক্রিয়াকলাপের মধ্যে একটি টুকরা রয়েছে এবং আমি এটিকে অন্য একটি খণ্ডের সাথে প্রতিস্থাপন করতে চাই:

FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
SectionDescriptionFragment bdf = new SectionDescriptionFragment();
ft.replace(R.id.book_description_fragment, bdf);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();

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

বইয়ের বিশদ খণ্ডের এক্সএমএলে আইডি বুক_ডেস্কিপশন_ফ্র্যাগমেন্ট রয়েছে এবং বিভাগের বিবরণ খণ্ডের জন্য এক্সএমএল আইডি বিভাগ_ বিবরণ_ফ্রেগমেন্ট রয়েছে।

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

উত্তর:


250

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

দ্রষ্টব্য: আর.আইডি.ফ্রেগমেন্ট_কন্টেইনারটি আপনি যে অংশটি টুকরো টুকরো টুকরো টানতে নিয়ে আসছেন তাতে আপনার পছন্দের একটি বিন্যাস বা ধারক।

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack if needed
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

8
এই ক্ষেত্রে আর.আইডি.ফ্রেগমেন্ট_সামগ্রী কী?
গাই

4
@ গুয়, আপনি যে লেআউটটি ফ্রেমে লোড করতে চান তা হতে পারে।
সাবিন সেবাস্তিয়ান

1
এক্সএমএল ফাইলে খণ্ডের নাম কী হওয়া উচিত? আমি গতিশীলভাবে খণ্ড যুক্ত করতে চাই এবং কোনও স্থিতিশীল খণ্ড চাই না।
রজত মেহরা

1
@ রাজতমেহরা যদি আপনি গতিশীলভাবে টুকরো টুকরো যোগ করতে চান তবে আপনাকে এক্সএমএল এর ভিতরে খণ্ডটি মোটেও নির্দিষ্ট করতে হবে না। আপনি একটি ধারক ভিউ ব্যবহার করতে পারেন। উত্তরটি আবার পড়ুন।
সুবিন সেবাস্তিয়ান

4
@ আহমেদ এর কারণ হ'ল আর্কিটেকচারের মাধ্যমে সিস্টেমটি প্রতিটি <ফ্রেমমেন্ট> ট্যাগের সাথে সংশ্লিষ্ট টুকরা দ্বারা সরবরাহিত ভিউ (গোষ্ঠী) দ্বারা প্রতিস্থাপন করে onCreateView()। সুতরাং, আপনি যেমন ধরে নিতে পারেন, খণ্ডের কোনও রেফারেন্স আসলে দৃশ্য স্তরে হারিয়ে গেছে। সুতরাং, আপনি মূলত কোনও খণ্ড প্রতিস্থাপন করতে পারবেন না, তবে আপনি এখন পাত্রে উপস্থিত ভিউগুলি ম্যানুয়ালি মুছে ফেলতে পারেন এবং প্রয়োজনে পরিবর্তে সেখানে একটি খণ্ড রেখে দিতে পারেন।
সাবিন সেবাস্তিয়ান

35

এই প্রশ্নটি দেখুন

আপনি কেবলমাত্র " গতিশীল যুক্ত খণ্ড " প্রতিস্থাপন করতে পারেন ।

সুতরাং, আপনি যদি একটি গতিশীল খণ্ড যুক্ত করতে চান তবে এই উদাহরণটি দেখুন।


1
ওহে . আমি সমাধানটি আবিষ্কার করেছি, আসলে আমি পূর্ববর্তী খণ্ডের বিষয়বস্তুগুলির জন্য অন্য একটি খণ্ডটি ব্যবহার করার পরিবর্তে একটি বিন্যাসে টুকরো টুকরোগুলি রাখছিলাম না
লায়ন হার্ট

না, এখানে আমি পুরো খণ্ডটি নতুন খণ্ডের সাথে প্রতিস্থাপন করতে চাইছিলাম।
সানা

1
@ লায়ন হার্ট, আপনি যে সমাধানটি পেয়েছেন তা কি বিস্তারিতভাবে বর্ণনা করতে পারেন?
নমরাথা

লিঙ্কটি মারা গেছে: /
নিওন ওয়ারেজ

8

আমি খণ্ড প্রতিস্থাপন এবং জীবনচক্র পরিচালনা করার জন্য নিখুঁত পদ্ধতিটির সাথে একটি টুকরো তৈরি করেছি ।

এটি কেবলমাত্র বর্তমান টুকরাটিকে নতুন দ্বারা প্রতিস্থাপন করবে, যদি এটি একই না হয় এবং যদি এটি ব্যাকস্ট্যাকে না থাকে (এই ক্ষেত্রে এটি এটি পপ করবে)।

এটিতে বেশ কয়েকটি বিকল্প রয়েছে যেন আপনি ব্যাকস্ট্যাকে টুকরোটি সংরক্ষণ করতে চান।

=> এখানে সংক্ষেপ দেখুন

এটি এবং একটি একক ক্রিয়াকলাপ ব্যবহার করে আপনি এটি আপনার ক্রিয়াকলাপে যুক্ত করতে চাইতে পারেন:

@Override
public void onBackPressed() {
    int fragments = getSupportFragmentManager().getBackStackEntryCount();
    if (fragments == 1) {
            finish();
            return;
    }

    super.onBackPressed();
}

1
@ রামিপ লিঙ্কটি প্রত্যাশার মতো কাজ করছে। আপনি এটি দেখতে পারেন যা আরও ভাল হতে পারে IMO github.com/HugoGresse/Anecdote/blob/master/app/src/main/java/io/…
হুগো গ্রেস

8

Android.support.v4 এ নীচের কোডটি ব্যবহার করুন

FragmentTransaction ft1 = getFragmentManager().beginTransaction();
WebViewFragment w1 = new WebViewFragment();
w1.init(linkData.getLink());
ft1.addToBackStack(linkData.getName());
ft1.replace(R.id.listFragment, w1);
ft1.commit();

4

ভি 4 ব্যবহার করে এই কোডটি ব্যবহার করুন

 ExampleFragment newFragment = new ExampleFragment();     
 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();  
 // Replace whatever is in the fragment_container view with this fragment,  
 // and add the transaction to the back stack so the user can navigate back   
 transaction.replace(R.id.container, newFragment);
 transaction.addToBackStack(null);  
 // Commit the transaction   
 transaction.commit();

3

আশা করি আপনি ভাল করছেন। আমি যখন কাজ শুরু করি Android Fragmentsতখন আমারও একই সমস্যা হয় তখন আমি প্রায় 1- কিভাবে অন্যের সাথে খণ্ডটি স্যুইচ করতে পারি তা পড়লাম। 2- Fragment containerকোনও খণ্ড না থাকলে কীভাবে টুকরো যোগ করতে হবে।

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

public void switchFragment(BaseFragment baseFragment) {
    try {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
        if (getSupportFragmentManager().findFragmentById(R.id.home_frame) == null) {
            ft.add(R.id.home_frame, baseFragment);
        } else {
            ft.replace(R.id.home_frame, baseFragment);
        }
        ft.addToBackStack(null);
        ft.commit();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

আপনার কোড সময় উপভোগ করুন :)


3

ভিউপেজার ব্যবহার করুন। এটা আমার জন্য কাজ।

final ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.vp_pager); 
button = (Button)result.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        viewPager.setCurrentItem(1);
    }
});

1

আপনি এই কোড ব্যবহার করতে পারেন

((AppCompatActivity) getActivity()).getSupportFragmentManager().beginTransaction().replace(R.id.YourFrameLayout, new YourFragment()).commit();

বা আপনি এই কোড ব্যবহার করতে পারেন

YourFragment fragments=(YourFragment) getSupportFragmentManager().findFragmentById(R.id.FrameLayout);

        if (fragments==null) {
            getSupportFragmentManager().beginTransaction().replace(R.id.FrameLayout, new Fragment_News()).commit();
        }

0

কোটলিনে আপনি এটি করতে পারেন:

// instantiate the new fragment
val fragment: Fragment = ExampleFragment()

val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.book_description_fragment, fragment)
transaction.addToBackStack("transaction_name")
// Commit the transaction
transaction.commit()

0

আপনি লেনদেনের জন্য এর কাজটি সহজ কোডটি ব্যবহার করতে পারেন

Fragment newFragment = new MainCategoryFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame_NavButtom, newFragment);
ft.commit(); 

0

আমি একক লাইন কোডে গতিশীলভাবে টুকরো পরিবর্তন করি
এটি যে কোনও এসডিকে সংস্করণ এবং অ্যান্ড্রয়েডেক্সে
আমি নেভিগেশন হিসাবে ব্যবহার করি তে কাজ করেBottomNavigationView

    BottomNavigationView btn_nav;
    FragmentFirst fragmentFirst;
    FragmentSecond fragmentSecond;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        fragmentFirst = new FragmentFirst();
        fragmentSecond = new FragmentSecond ();
        changeFragment(fragmentFirst); // at first time load the fragmentFirst
        btn_nav = findViewById(R.id.bottomNav);
        btn_nav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                switch(menuItem.getItemId()){
                    case R.id.menu_first_frag:
                        changeFragment(fragmentFirst); // change fragmentFirst
                        break;
                    case R.id.menu_second_frag:
                        changeFragment(fragmentSecond); // change fragmentSecond
                        break;
                        default:
                            Toast.makeText(SearchActivity.this, "Click on wrong bottom SORRY!", Toast.LENGTH_SHORT).show();
                }
                return true;
            }
        });
    }
public void changeFragment(Fragment fragment) {
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_layout_changer, fragment).commit();
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.