Android-fragmentTransaction.replace() не работает в библиотеке поддержки 25.1.0

я заменяю FrameLayout фрагментом, используя fragmentTransaction.replace().

планировка:

<FrameLayout
        android:id="@+id/articlesAppender"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
</FrameLayout>

замена в onCreate деятельности:

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
articlesFragment = (ArticlesFragment) fragmentManager.findFragmentByTag(ARTICLES_FRAGMENT_TAG);

if (articlesFragment == null) {
    articlesFragment = new ArticlesFragment();
}

fragmentTransaction.replace(R.id.articlesAppender, articlesFragment, ARTICLES_FRAGMENT_TAG);
fragmentTransaction.commit();
ArticleFragment это:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.articles_fragment, container, false);
    view.setVisibility(View.GONE);
    return view;
}

но view.setVisibility(View.GONE); не работает в библиотеке поддержки 25.1.0. Итак, фрагмент по-прежнему будет отображаться на экране. Если я установлю видимость articlesAppender to GONE. Поэтому он должен выглядеть так:

<FrameLayout
        android:id="@+id/articlesAppender"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone">
</FrameLayout>

тогда фрагмент будет не будет видно на экране, но когда я пытаюсь позвонить view.setVisibility(View.VISIBLE); позже, это все еще не работает. Фрагмент все еще не виден.

что означает view который возвращен inflater.inflate(R.layout.articles_fragment, container, false); не является реальным видом фрагмента. Но он отлично работает на библиотеке 25.0.1 поддержки.

так это ошибка Android?

3 ответов


сообщается о проблеме. больше людей, кажется, есть эта проблема

https://code.google.com/p/android/issues/detail?id=230191


похоже, это сообщение об ошибке, как отмечено в сообщении Гиллиса Хааснота.

Я заметил, что если я разделю replace() на remove() и add () и использую commitNow (), похоже, работает так, как ожидалось.

исходный код (сбой, начинающийся с 25.1.0):

fragMngr.beginTransation()
    .replace(R.id.detail_container, newFrag, fragTag)
    .commit();

решения:

// remove old fragment
Fragment oldFrag = fragMngr.findFragmentByTag(fragTag);
if (oldFrag != null {
    fragMngr.beginTransaction().remove(oldFrag).commitNow();
}

// add new fragment
fragMngr.beginTransaction()
    .add(R.id.detail_container, newFrag, fragTag)
    .commitNow();

    //replace fragment
    private void replaceFragment(final Fragment newFragment, final int containerId) {
        final FragmentManager fragmentManager = getFragmentManager();
         final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(containerId, newFragment, newFragment.getClass().getSimpleName());
       fragmentTransaction.commit();
   }

ArticleFragment это:

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.articles_fragment, container, false);
                return view;
    }

    <FrameLayout
            android:id="@+id/articlesAppender"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    </FrameLayout>

просто вызовите этот метод в своем MainActivity onCreate() Где

newFreagment = " фрагмент, который вы хотите заменить на" containerId = "Framelayout id"