FrameLayout 有 LayoutBehavior 时 CoordinatorLayout 中 FrameLayout 中的 Fragment 闪烁

Fragment in FrameLayout in CoordinatorLayout flickers when FrameLayout has LayoutBehavior

在我们的应用程序中,我们使用带有两个工具栏(顶部和底部)的 CoordinatorLayout,滚动时它们会滑出视图。在工具栏之间,我们有一个 FrameLayout,用于保存片段。目前我们主要使用一个包含 NestedWebView (https://github.com/takahirom/webview-in-coordinatorlayout) 的 Fragment。我们通过调用 fragmentManager.replace().

在运行时添加片段

问题是 FrameLayout 似乎经常消失。有时它从应用程序启动时就消失了,有时当我单击顶部工具栏上的按钮时它消失了。当它消失时,我可以通过旋转 phone 或在顶部工具栏上滑动来使其显示。我出于调试目的对 CoordinatorLayout 进行了着色,我可以清楚地看到,有时 WebView 会按预期填充 space,但通常 WebView 是不可见的。

我想,当我删除

时,问题不会发生

app:layout_behavior="@string/appbar_scrolling_view_behavior"

来自框架布局。但是当然,滚动不会按预期工作。 也许值得一提的是,我们的 Fragment 有

setRetainInstance(true)

设置。 有人可以告诉我,我该如何解决这个问题?以下是文件:

协调器布局xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".activity.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways|snap"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <FrameLayout
        android:id="@+id/content_container"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:theme="@style/AppTheme.AppBarOverlay"
        app:layout_behavior=".ui.BottomBarBehavior">

        <android.support.v7.widget.ActionMenuView
            android:id="@+id/toolbar2"
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways|snap"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

</android.support.design.widget.CoordinatorLayout>

WebViewFragmentxml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/content_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.github.dfa.diaspora_android.ui.ContextMenuWebView
        android:id="@+id/webView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentEnd="true"
        android:layout_alignParentStart="true"
        android:layout_centerVertical="true"/>
    <ProgressBar
        android:id="@+id/progressBar"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="fill_parent"
        android:indeterminate="false"
        android:layout_height="wrap_content"
        android:layout_marginTop="-7dp" />
</RelativeLayout>

MainActivity 中的一些代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main__activity);
    ButterKnife.bind(this);

    setSupportActionBar(toolbarTop);
    MenuInflater menuInflater = getMenuInflater();
    Menu bottomMenu = toolbarBottom.getMenu();
    menuInflater.inflate(R.menu.main__menu_bottom, bottomMenu);
    toolbarBottom.setOnMenuItemClickListener(new ActionMenuView.OnMenuItemClickListener() {
        public boolean onMenuItemClick(MenuItem item) {
            return MainActivity.this.onOptionsItemSelected(item);
        }
    });

    setupUI(savedInstanceState);
}

private void setupUI(Bundle savedInstanceState) {
...
    showFragment(StreamFragment.FRAGMENT_NAME);
    ...
    handleIntent(getIntent());
}

private void showFragment(String tag) {
    FragmentManager fm = getSupportFragmentManager();
    CustomFragment fragment = (CustomFragment) fm.findFragmentByTag(tag);
    if (fragment == null) {
        switch (tag) {
            case StreamFragment.FRAGMENT_NAME:
                Log.d(App.TAG, "Create new StreamFragment");
                fragment = new StreamFragment();
                break;
            default:
                Log.e(App.TAG, "Missing fragment "+tag+" in showFragment switch case...");
                return;
        }
    }
    currentFragment = fragment;
    if (!fragment.isVisible()) {
        Log.d(App.TAG, "Fragment not visible. Replace it");
        fm.beginTransaction().replace(R.id.content_container, fragment, tag).commit();
        //Add fragment's bottom menu entries
        currentFragment.onCreateBottomOptionsMenu(toolbarBottom.getMenu(), getMenuInflater());
    } else {
        Log.d(App.TAG, "Fragment was visible");
    }

}

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);

    // Reinitialize the UI
    setupUI(null);
}

我可以通过更改

来解决这个问题

compile 'com.android.support:design:24.2.0'

compile 'com.android.support:design:24.1.0'

在我的 app.gradle 文件中。