Bir parçayı aktivite grubu içindeki başka bir parçayla değiştirme


137

Bir grup etkinliği içinde bir parçası var ve başka bir parça ile değiştirmek istiyorum:

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();

Etkinlik grubunu kullanmadan ayrı bir proje olarak yapıldığında iyi çalışır, kontrol getview () içine girdiği için her şey günlük kedide iyi çalışır, ancak hiçbir görünüm görünmez, herhangi bir istisna bile ortaya çıkmaz, kitap detay parçasının bölüm detay parçası ile değiştirilmelidir.

Xml kitap detayı parçasının id book_description_fragment ve xml bölüm açıklaması parçacığı için id section_description_fragment kimliğine sahiptir.

Yukarıdaki kod bir öğenin onClick yönteminde, kullanıcı yatay kaydırma görünümünde bir öğeye dokunduğunuzda, parçanın değişmesini istiyorum.

Yanıtlar:


250

XML'de sabit kodlanmış parçalar değiştirilemez. Bir parçayı başka bir parçayla değiştirmeniz gerekiyorsa, önce dinamik olarak eklemelisiniz.

Not: R.id.fragment_container , parçayı getirdiğiniz etkinlikte seçtiğiniz bir düzen veya kaptır.

// 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
bu durumda R.id.fragment_container nedir?
Guy

4
@Al, Parçayı içine yüklemek istediğiniz herhangi bir düzen olabilir.
Subin Sebastian

1
xml dosyasındaki parçanın adı ne olmalı? Parçayı dinamik olarak eklemek istiyorum ve statik bir parça istemiyorum.
Rajat Mehra

1
@RajatMehra Dinamik olarak parça eklemek istiyorsanız, XML içinde hiç bir parça belirtmeniz gerekmez. Bir kapsayıcı görünümü kullanabilirsiniz. Lütfen cevabı tekrar okuyunuz.
Subin Sebastian

4
@Ahmed Bunun nedeni, mimariye göre, sistemin her <fragment> etiketini karşılık gelen parçaların sağladığı görünüm (grup) ile değiştirmesidir ' onCreateView(). Böylece, tahmin edebileceğiniz gibi, parçaya yapılan herhangi bir referans aslında görüntü düzeyinde kaybolur. Yani, bir parçayı temel olarak değiştiremezsiniz, bunun yerine artık kapta mevcut olan görünümleri manuel olarak kaldırabilir ve gerekirse bir parçayı buraya koyabilirsiniz.
Subin Sebastian

35

Lütfen bu soruya bakın

Yalnızca " dinamik olarak eklenen bir parçayı " değiştirebilirsiniz.

Dinamik bir parça eklemek istiyorsanız, bu örneğe bakın .


1
Selam . Çözümü keşfettim, aslında parçanın içeriğini bir düzene yerleştirmedim, bunun yerine önceki parçanın içeriği için başka bir parçayı kullanıyordum
Lion Heart

Hayır, burada tüm parçayı yeni bir parçayla değiştirmek istiyordum.
Sana

1
@Lion Heart, Bulduğunuz çözümü lütfen açıklar mısınız?
Namratha

Bağlantı öldü: /
Neon Warge

8

Ben parça değiştirme ve yaşam döngüsü yönetmek için mükemmel bir yöntem ile bir özledim .

Sadece aynı değilse ve backstack değilse mevcut parçayı yenisiyle değiştirir (bu durumda patlar).

Parçanın backstack'e kaydedilmesini istediğiniz gibi birkaç seçenek içerir.

=> Bkz.

Bunu ve tek bir Etkinliği kullanarak, bunu etkinliğinize eklemek isteyebilirsiniz:

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

    super.onBackPressed();
}

1
@ RémiP bağlantı beklendiği gibi çalışıyor. Daha iyi IMO olabilir bunu kontrol edebilirsiniz github.com/HugoGresse/Anecdote/blob/master/app/src/main/java/io/...
Hugo Gresse

8

Android.support.v4 içinde aşağıdaki kodu kullanın

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

V4 kullanarak bu kodu kullanın

 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

umarım iyi gidiyorsun. çalışmaya başladığımda Android Fragmentsda aynı problemi yaşıyordum o zaman 1- okudum. 2- Fragment containerHerhangi bir parçası yoksa nasıl parça eklenir .

biraz Ar-Ge'den sonra, bugüne kadar pek çok Projede bana yardımcı olan bir fonksiyon yarattım ve hala bu basit fonksiyonu kullanıyorum.

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();
    }
}

Kod zamanınızın tadını çıkarın :)


3

ViewPager kullanın. Benim için iş.

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

Bu kodu kullanabilirsiniz

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

veya Bu Kodu Kullanabilirsiniz

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

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

0

Kotlin'de şunları yapabilirsiniz:

// 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

basit kodunu işlem için kullanabilirsiniz

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

0

Tek satır kodunda dinamik olarak parçayı değiştiriyorum
Herhangi bir SDK sürümünde ve androidx'te
navigasyon kullanıyorumBottomNavigationView

    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();
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.