Дублирование фрагмента в транзакции фрагмента - PullRequest
45 голосов
/ 14 марта 2011

Хорошо, всякий раз, когда я пытаюсь заменить фрагмент в моем приложении, он только добавляет фрагмент внутри контейнера, которым является другой фрагмент, и оставляет текущий фрагмент.Я попытался вызвать замену и сослаться на представление, содержащее фрагмент, и на сам фрагмент.Ни одна из этих работ.Я могу добавить фрагмент в представление с помощью диспетчера транзакций фрагмента, но даже если я попытаюсь удалить его после добавления, он не будет работать.Любая помощь будет оценена.Вот мои файлы.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //Setup the actionabar. Use setDrawableBackground to set a background image for the actionbar.
    final ActionBar actionbar = getActionBar();
    actionbar.setDisplayShowTitleEnabled(false);
    actionbar.setDisplayUseLogoEnabled(true);
    actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionbar.addTab(actionbar.newTab().setText(R.string.home_tab_text).setTabListener(this),true);
    actionbar.addTab(actionbar.newTab().setText(R.string.insert_tab_text).setTabListener(this));

    Fragment fragment = new insert_button_frag();
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.button_fragment, fragment);
    transaction.addToBackStack(null);

    transaction.commit();
}

Вот макет

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:orientation="vertical"
        android:id="@+id/button_fragment_container"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <fragment
            android:name="com.bv.silveredittab.home_button_frag"
            android:id="@+id/button_fragment"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <fragment
            android:name="com.bv.silveredittab.quick_insert_frag"
            android:id="@+id/quick_insert_frag"
            android:layout_width="350dip"
            android:layout_height="fill_parent" />

        <fragment
            android:name="com.bv.silveredittab.editor_frag"
            android:id="@+id/editor_frag"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

    </LinearLayout>

</LinearLayout>

А вот фрагмент кода

public class insert_button_frag extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        return inflater.inflate(R.layout.insert_buttons,container, false);
    }
}

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

Ответы [ 4 ]

33 голосов
/ 18 марта 2011

Я решил эту проблему с помощью заполнителя в моем макете, а затем прикрепил к нему свой фрагмент во время выполнения.

Как и вы, если я создам экземпляр своего фрагмента в макете xml, его содержимое останется видимым после замены его другим фрагментом во время выполнения.

18 голосов
/ 16 марта 2012

Проблема в этой строке:

transaction.replace(R.id.button_fragment, fragment);

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

transaction.replace(R.id.button_fragment_container, fragment);

edit: Я вижу в вашем вопросе, что вы пробовали оба варианта. Я проверил и проверил поведение. Это похоже на ошибку в FragmentTransaction API.

Edit2: не ошибка в конце концов. Вы просто не можете заменить фрагменты, добавленные статически в файл макета. Вы можете заменить только те, которые были добавлены программно ( Android: невозможно заменить один фрагмент другим )

2 голосов
/ 14 марта 2011

У меня была такая же проблема.Взгляните на эту ссылку: Дублирование фрагмента Android

Интересно, причина того, что тот факт, что вы передаете контейнер в метод inflater.inflate (), вызывает его создание нового фрагмента внутри?старого вместо оптовой замены.Я предоставляю 'null' своим инфляторам в рабочей версии.

Вот основные сведения о версии, с которой я работаю ...

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
   View newFrag = new View(getActivity().getApplicationContext());
   newFrag = inflater.inflate(R.id.frag, null);
   return newFrag;
}
0 голосов
/ 20 июля 2016

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 2. * * * * * * * * * * * * 100 '* - очень запутанно, потому что вначале показано, как внедрить жестко закодированный фрагмент в ваш xml.Но если вы действительно хотите заменить существующий фрагмент новым, то вы должны добавить его (первый) во время выполнения.

Какой официальный сайт Состояние:

FragmentTransaction replace (int containerViewId, Fragment Fragment, String tag)

Заменить существующий фрагмент, который был добавлен в контейнер.По сути, это то же самое, что вызов метода remove (Fragment) для всех добавленных в данный момент фрагментов, которые были добавлены с тем же containerViewId, а затем для добавления (int, Fragment, String) с теми же аргументами, что и здесь.

Youдолжен заметить, что он говорит, что Заменить существующий фрагмент, который был добавлен в контейнер

Итак, ваш xml должен выглядеть как someActivity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    tools:context="someActivity">

    <ImageView
        .../>

    <LinearLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="bottom"/>

</RelativeLayout>

И чем в вашей деятельности занимаются в OnCreate ()

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        [...]
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container, new FirstFragment).commit();

    }

Чем вы можете легко заменить фрагмент вашей анимацией, а событие добавить его в задний стек вчтобы сохранить свое состояние.

private SecondFrag getSecondFrag(){
    if(secondFrag == null)
        secondFrag = new SecondFrag()
    return secondFrag;
}

private void openRechargeFragment(){
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setCustomAnimations(R.anim.show_frag, R.anim.hide_frag,
                R.anim.show_frag, R.anim.hide_frag);
        ft.replace(R.id.fragment_container, getSecondFrag(), "myTAG");
        ft.addToBackStack(null);
        ft.commit();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...