Android - fragmentTransaction.replace()不适用于支持库25.1.0

时间:2016-12-15 06:50:36

标签: android fragment android-support-library

我使用fragmentTransaction.replace()将片段替换为片段。

布局:

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

替换活动&#39; 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&#39; 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);时,它仍然不起作用。 片段仍然不可见。

这意味着view返回的inflater.inflate(R.layout.articles_fragment, container, false);不是片段的真实视图。 但它在支持库25.0.1上完美运行。

所以这是一个Android的错误?

3 个答案:

答案 0 :(得分:7)

据报道

问题。更多人似乎有这个问题

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

答案 1 :(得分:2)

如Gillis Haasnoot的帖子中所述,这似乎是一个报道的错误。

我注意到如果我将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();

答案 2 :(得分:-1)

    //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&on;创建:

 @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 =&#34;您要用&#34;替换片段 containerId =&#34; Framelayout id&#34;