Не можете удалить фрагмент из FrameLayout? - PullRequest
7 голосов
/ 28 марта 2012

У меня есть макет для ландшафтного режима, который показывает ListView слева и FrameLayout справа.Когда элемент выбирается из списка, в FrameLayout добавляется другой фрагмент

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout);
FragmentTransaction ft = fragmentManager.beginTransaction();
if (myFragment == null) {
    myFragment = new MyFragment(uri);
    ft.replace(R.id.myFrameLayout, playerFragment);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.commitAllowingStateLoss();
}

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

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout);
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.remove(myFragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
ft.commitAllowingStateLoss();

Есть идеи, почему его не удаляют из представления?

Ответы [ 6 ]

12 голосов
/ 23 октября 2013

@ DaveJohnston Я попробовал ваш код для удаления фрагмента, который я только что отлил .... спасибо:)

Эй, я не знаю, это решение вашей проблемы или нет, но вы пытаетесь так, как это будет работать:

Подход к добавлению фрагмента:

YourFragment yourFrament;

//Add your Fragment
public void addYourFragment(){
yourFragment = new YourFragment();

FragmentTransaction transation = getSupportFragmentManager().beginTransaction();
transation.replace(R.id.yourFlowLayout, yourFragment);

        transation.commit();

}   

Подход к удалению фрагмента:

 //Remove Fragment
    public void removeYourFragment(){
     FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            if (yourFragment != null) {           
                transaction.remove(yourFragment);
                transaction.commit();
                transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
                yourFragment = null;
            }
    }
3 голосов
/ 28 марта 2012

вы объявляете фрагмент в xml? Цитирую Дайан Хэкборн из Google:

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

надеюсь, это поможет

0 голосов
/ 22 января 2016

Если у вас есть Fragment, который не удаляется при замене Fragment на FrameLayout? Вы можете удалить его, совершив отдельный переход удаления с FragmentTransaction.TRANSIT_FRAGMENT_CLOSE на нем перед вызовом обычного коммита замены.

Fragment removeThisFragment;//Keep a reference to the fragment you want to remove
...
 FragmentManager fragmentManager =  getSupportFragmentManager();
 FragmentTransaction transaction =  fragmentManager.beginTransaction();

 // This fragment "sometimes" do not get replaced so we remove it here if it's added.
        if(removeThisFragment!=null&&removeThisFragment.isAdded()) {
            transaction =  fragmentManager.beginTransaction();
            transaction.remove(removeThisFragment);
            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
            transaction.commitAllowingStateLoss();
        }

        // update the main content by replacing fragments
        transaction =  fragmentManager.beginTransaction();
        transaction.replace(R.id.content_frame, fragment, TAG_MAIN_FRAGMENT).commit();

Но я предлагаю сначала попытаться выяснить, почему фрагмент не заменяется, проверить, выполняет ли он какую-то тяжелую работу или что-то мешает его заменить ?? но если вам нужно быстрое временное исправление, попробуйте приведенный выше код.

0 голосов
/ 01 августа 2015
private static String TAG_FRAGMENT="MyFragment";
MyFragment myFragment = (MyFragment)   fragmentManager.findFragmentById(R.id.myFrameLayout);
 FragmentTransaction ft = fragmentManager.beginTransaction();
 if (myFragment == null) {
      myFragment = new MyFragment(uri);
     ft.replace(R.id.myFrameLayout, playerFragment,TAG_FRAGMENT);
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
     ft.addToBackStack(TAG_FRAGMENT);
     ft.commit();
 }

при замене фрагмента на метод ft.addToBackStack(null) после легкого удаления фрагмента.

Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);

if(fragment != null)
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
0 голосов
/ 13 марта 2015

Мне было очень трудно найти SO-ссылку на эту проблему, возникающую, когда НЕ устанавливается <fragment> через XML, но действительно устанавливается каждый Fragment динамически с FragmentTransaction и <FrameLayout>.

УпрощениеРешением Gru, которое решило это для меня, было просто добавление .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) к моей транзакции замены, и это сработало!Предыдущие фрагменты теперь фактически скрыты от глаз.

Я думаю, что другие переходы также будут работать.

0 голосов
/ 02 мая 2013

Когда вы находите свой фрагмент по идентификатору, вы получаете ссылку на контейнер фрагмента, а не на сам фрагмент.Используйте TAG, когда добавляете фрагмент, а затем находите с помощью TAG:

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentByTag("yourTag");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...