FragmentTransaction.remove()仅在SwipeRefreshLayout处于活动状态时才删除片段

时间:2016-10-29 07:08:55

标签: android android-fragments swiperefreshlayout

我的问题的主旨:

我有多个按顺序添加但未重新排序的片段。几乎所有人都将SwipeRefreshLayouts作为根视图。当用户触发onBackPressed时,应删除最后一个片段。如果打开新片段,则隐藏最后一个片段。

如果SwipeRefreshLayout处于活动状态(即刷新状态设置为 true 并且onRefresh被调用)并且用户弹出当前片段,则视图将一直停留,直到应用程序重新启动。我已经确认调用了onPause()和onDestroy()。我已经在每种类型的片段中对此进行了测试,因此我几乎可以确定问题在于如何删除片段。

我的代码:

ORDER BY

在BaseFragment.java内部

//I know this is a misnomer. I just changed the inside from 
//addToBackStack which got me the same effect
protected void addToBackStack(BaseFragment fragment){
    FragmentTransaction ft = fragMan.beginTransaction();
    if(fragCount > 0)
        ft.hide(peekBackStack());
    ft.add(R.id.fragment_container, fragment, Integer.toString(fragCount++)).commit();
    invalidateOptionsMenu();
}

protected BaseFragment peekBackStack(){
    return (BaseFragment)(fragMan.findFragmentByTag(Integer.toString(fragCount - 1)));
}

@Override
public void onBackPressed(){
    if (fragCount <= 1) {
        //...do stuff & finish
    } else {
        BaseFragment fragment = peekBackStack();
        if(fragment != null) {
            if (fragment.isWeb() && ((WebFragment) fragment).canGoBack())
                ((WebFragment) fragment).goBack();
            else
                popActive();
        }
        else
            finish();
    }
}

public void popActive(){
    BaseFragment remove = peekBackStack();
    fragCount--;
    BaseFragment show = peekBackStack();
    fragMan.beginTransaction().remove(remove).commit();
    Log.d(TAG, ""+remove.isVisible());
    fragMan.beginTransaction().show(show).commitNow();
    show.initAppBar();
}

WebFragment XML:

@Override
@NonNull
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                         @Nullable Bundle state){
    ViewGroup root = (ViewGroup) inflater.inflate(getLayoutResource(), container, false);
    if(root instanceof SwipeRefreshLayout) {
        swipeRefreshLayout = (SwipeRefreshLayout) root;
        swipeRefreshLayout.setOnRefreshListener(this);
    }
    return root;
}

@Override
public void onDestroy(){
    super.onDestroy();
    if(swipeRefreshLayout != null)
        swipeRefreshLayout.destroyDrawingCache();
}
...

主要活动XML:

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_refresh_submission_link"
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.github.ksoichiro.android.observablescrollview.ObservableWebView
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:id="@+id/observable_web"
    android:layout_centerHorizontal="true"
    android:layout_below="@+id/toolbar"
    android:scrollbarStyle="outsideOverlay"
    android:fadeScrollbars="true">

</com.github.ksoichiro.android.observablescrollview.ObservableWebView>

1 个答案:

答案 0 :(得分:0)

所以我在搜索后找到了related thread。这两个解决方案对我有用,虽然我认为我现在更喜欢FrameLayout包装器。这似乎是android本身的一个错误