Android - fragmentTransaction.replace() 不适用于支持库 25.1.0
Android - fragmentTransaction.replace() not works on support library 25.1.0
我使用 fragmentTransaction.replace()
.
将 FrameLayout 替换为片段
布局:
<FrameLayout
android:id="@+id/articlesAppender"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
在 Activity 的 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 的 onCreate:
@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
的可见性设置为 GONE
。
所以它应该是这样的:
<FrameLayout
android:id="@+id/articlesAppender"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone">
</FrameLayout>
然后片段将不会在屏幕上可见,但是当我稍后尝试调用 view.setVisibility(View.VISIBLE);
时,它仍然不起作用。
该片段仍然不可见。
也就是说inflater.inflate(R.layout.articles_fragment, container, false);
返回的view
不是片段的真实视图。
但它在支持库 25.0.1 上完美运行。
所以这是 Android 的错误?
//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 的 onCreate:
@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 = "Fragment you want to replace with"
containerId = "Framelayout id"
已报告问题。似乎有更多人遇到此问题
这似乎是一个已报告的错误,如 Gillis Haasnoot 的 post 所述。
我注意到,如果我将 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();
我使用 fragmentTransaction.replace()
.
布局:
<FrameLayout
android:id="@+id/articlesAppender"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
在 Activity 的 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 的 onCreate:
@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
的可见性设置为 GONE
。
所以它应该是这样的:
<FrameLayout
android:id="@+id/articlesAppender"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone">
</FrameLayout>
然后片段将不会在屏幕上可见,但是当我稍后尝试调用 view.setVisibility(View.VISIBLE);
时,它仍然不起作用。
该片段仍然不可见。
也就是说inflater.inflate(R.layout.articles_fragment, container, false);
返回的view
不是片段的真实视图。
但它在支持库 25.0.1 上完美运行。
所以这是 Android 的错误?
//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 的 onCreate:
@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 = "Fragment you want to replace with" containerId = "Framelayout id"
已报告问题。似乎有更多人遇到此问题
这似乎是一个已报告的错误,如 Gillis Haasnoot 的 post 所述。
我注意到,如果我将 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();