Замена фрагмента не работает при использовании ChildFragmentManager в Android

Я хочу добавить фрагмент как дочерний к другому фрагменту
Я использую ChildFragmentManager

Вот мой ChildFragmentManagerActivity.java
ChildFragment.java
ParentFragment.java
макеты которого выглядят следующим образом:
activity_childfragmentmanager.xml
layout_parentfragment.xml
layout_childfragment.xml

Мне удалось успешно добавить ParentFragment. Пожалуйста, проверьте изображение ниже
parent_fragment.png

Но когда я пытаюсь добавить ChildFragment, он выглядит следующим образом:
child_fragment

Я хочу, чтобы дочерний фрагмент был добавлен как контент, заменив предыдущий макет
Заранее спасибо


person KK_07k11A0585    schedule 09.07.2013    source источник
comment
Я хочу, чтобы дочерний фрагмент был добавлен как контент, заменив предыдущий макет. Можете ли вы объяснить это более четко, пожалуйста? Что такое предыдущий макет?   -  person Koso    schedule 09.07.2013
comment
Привет Косо Спасибо за ваш комментарий. Красная часть (layout_parentfragment) — это макет ParentFragment. Я добавляю к нему дочерний фрагмент. Синяя часть (layout_childfragment) — это макет ChildFragment. Я хочу, чтобы синий был заменен красным, полностью похожим на метод замены фрагмента. Но это просто добавление ChildFragment вместо его замены.   -  person KK_07k11A0585    schedule 10.07.2013
comment
Что насчет того, если вы добавите frameLayout в начало parent_layout с height=match_parent и visiblity=gone. И когда вы добавляете свой фрагмент в frameLayout, сделайте этот frameLayout видимым, чтобы он покрывал весь макет родительского фрагмента. Я думаю, вы хотите сделать это правильно?   -  person Koso    schedule 10.07.2013
comment
Да ты прав! Если я использую высоту FrameLayout и parent_layout как match_parent, это работает. Но это не работает в 2 случаях \n 1)** Если для высоты макета установлено значение wrap_content. \n 2)Если родительский макет отличается от RelativeLayout или FrameLayout**.\n Я хочу решить два вышеуказанных случая   -  person KK_07k11A0585    schedule 11.07.2013


Ответы (1)


Транзакция не удаляет представления, которые уже существуют в контейнере, который будет использоваться для транзакции. Чтобы удалить эти представления, вам нужно обернуть начальное содержимое ParentFragment как фрагмент и заменить его дочерним фрагментом (с транзакцией replace, а не с транзакцией add). Я внес некоторые изменения в ваш код, проверьте это ниже:

Родительский фрагмент:

public class ParentFragment extends Fragment {

private static final int CONTAINER_ID = 0x2222;
private static final String INITIAL_FRAG = "initial_fragment";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    FrameLayout wrapper = new FrameLayout(getActivity());
    wrapper.setId(CONTAINER_ID);
    // look for our two possible fragments, if we don't find the
    // InitialContentFragment add it
    if (getChildFragmentManager().findFragmentByTag(INITIAL_FRAG) == null) {
        InitialContentFragment initContent = new InitialContentFragment();
        Bundle args = new Bundle();
        args.putString("text",
                "I'm the initial content fragment in the parent fragment");
        initContent.setArguments(args);
        getChildFragmentManager().beginTransaction()
                .add(CONTAINER_ID, initContent, INITIAL_FRAG).commit();
    }
    return wrapper;
}

public void requestFragmentTransaction() {
    FragmentTransaction fragmentTransaction = getChildFragmentManager()
            .beginTransaction();
    ChildFragment childFragment = new ChildFragment();
    Bundle args = new Bundle();
    args.putString("text", "Hi I am Child Fragment");
    childFragment.setArguments(args);
    fragmentTransaction.replace(CONTAINER_ID, childFragment, "ChildFragment");
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();

}

}

где InitialContentFragment:

public static class InitialContentFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // inflate the layout file that would normally be in the
        // ParentFragment at start
        View view = inflater.inflate(R.layout.layout_parentfragment,
                container, false);
        Bundle bundle = getArguments();
        final String text = bundle.getString("text");
        TextView textView = (TextView) view.findViewById(R.id.textView1);
        textView.setText(text);
        Button button = (Button) view.findViewById(R.id.button1);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                ParentFragment parent = (ParentFragment) InitialContentFragment.this
                        .getParentFragment();
                parent.requestFragmentTransaction();
            }
        });
        return view;
    }
}

В качестве примечания: НИКОГДА не игнорируйте блок try-catch, как это делали вы.

person user    schedule 10.07.2013
comment
Я реализовал ваш код для Navigation Drawer, используя следующий код. stackoverflow.com/questions/23678513/ и он работает абсолютно нормально, но возникает проблема, когда вы нажимаете на фрагмент списка навигационных ящиков. Вкладки узла вкладок появляются и работают потрясающе, но когда вы возвращаетесь к другому действию и возвращаетесь к действию узла вкладок. Вкладки появляются, но появляется линейный фон макета узла вкладок, как показано на изображениях ниже, когда узел вкладок щелкнут один и два раза. i.stack.imgur.com/CzIsC.png i.stack.imgur.com/Dmxn3.png - person B.rohit Nare; 21.10.2014
comment
@B.rohitNare Пожалуйста, задайте новый вопрос, в котором подробно изложите свою проблему. - person user; 21.10.2014
comment
stackoverflow.com/questions/26483069/ @Luksprog Эй, приятель, пройди по ссылке - person B.rohit Nare; 21.10.2014
comment
@Luksprog, но кажется, что в вашем решении getChildFragmentManager().getBackStackEntryCount() всегда возвращает 0? любая подсказка? - person Narendrasinh Dodiya; 26.08.2015