Замена фрагмента другим фрагментом внутри группы действий - PullRequest
131 голосов
/ 14 апреля 2011

У меня есть фрагмент внутри групповой деятельности, и я хочу заменить его другим фрагментом:

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

Он отлично работает, когда выполняется как отдельный проект без использования группы действий, все работает нормальнов журнале cat управление осуществляется внутри getview (), но вид не виден, даже не возникает никаких исключений, я хочу заменить фрагмент сведений о книге фрагментом раздела.

XML-фрагмент фрагмента книги имеет идентификаторbook_description_fragment и xml для фрагмента описания раздела имеют идентификатор section_description_fragment.

Приведенный выше код относится к методу onClick элемента, я хочу, чтобы, когда пользователь нажимает на элемент в горизонтальной прокрутке, фрагмент изменяется.

Ответы [ 9 ]

242 голосов
/ 22 сентября 2013

Фрагменты, которые жестко запрограммированы в XML, не могут быть заменены. Если вам необходимо заменить фрагмент на другой, вы должны были бы добавить его динамически, прежде всего.

Примечание: R.id.fragment_container - это макет или контейнер по вашему выбору в упражнении, в которое вы переносите фрагмент.

// 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();
35 голосов
/ 05 июня 2011

Пожалуйста, посмотрите это Вопрос

Вы можете заменить только " динамически добавленный фрагмент ".

Итак, если вы хотите добавитьдинамический фрагмент, см. этот пример.

8 голосов
/ 28 сентября 2016

Используйте приведенный ниже код в 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();
8 голосов
/ 02 марта 2016

Я сделал суть с идеальным методом для управления фрагментом заменой и жизненным циклом .

Он заменяет только текущий фрагмент новым, если он не совпадает, и если он не находится в обратном стеке (в этом случае он выскочит).

Он содержит несколько опций, как будто вы хотите сохранить фрагмент в backstack.

=> См. Gist здесь

Используя это и одно упражнение, вы можете добавить это в свое действие:

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

    super.onBackPressed();
}
4 голосов
/ 03 октября 2016

Используйте этот код, используя v4

 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 голосов
/ 09 января 2018

Используйте ViewPager.Это работа для меня.

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);
    }
});
3 голосов
/ 07 февраля 2017

надеюсь, у вас все хорошо. Когда я начал работать с 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();
    }
}

наслаждайтесь вашим временем кода:)

0 голосов
/ 15 февраля 2019

В котлине вы можете сделать:

// 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 голосов
/ 21 сентября 2018

Вы можете использовать простой код своей работы для транзакции

Fragment newFragment = new MainCategoryFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame_NavButtom, newFragment);
ft.commit(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...