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 ответов
похоже, это сообщение об ошибке, как отмечено в сообщении Гиллиса Хааснота.
Я заметил, что если я разделю 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"