Подтвердить что ты не робот

Замена фрагмента другим фрагментом внутри группы действий

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

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 фрагмента детали книги имеет id book_description_fragment и xml для фрагмента описания раздела имеет id section_description_fragment.

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

4b9b3361

Ответ 1

Фрагменты, которые жестко запрограммированы в 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();

Ответ 2

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

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

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

Ответ 3

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

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

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

= > См. здесь Gist

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

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

    super.onBackPressed();
}

Ответ 4

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

Ответ 5

Используйте этот код, используя 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();

Ответ 6

надеюсь, что вы преуспеваете. Когда я начал работать с Android Fragments, то у меня тоже была такая же проблема, после чего я читал о 1- Как переключить фрагмент с другим. 2- Как добавить фрагмент, если Fragment container не имеет фрагмента.

то после некоторого R & D, я создал функцию, которая помогает мне во многих проектах до сих пор, и я все еще использую эту простую функцию.

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

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

Ответ 7

Используйте 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);
    }
});

Ответ 8

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

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

Ответ 9

В kotlin вы можете сделать:

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

Ответ 10

Вы можете использовать этот код

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