当FrameLayout具有LayoutBehavior时,CoordinatorLayout中的FrameLayout中的片段闪烁

时间:2016-09-16 22:46:03

标签: android android-fragments webview android-coordinatorlayout android-framelayout

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

在运行时添加Fragment

问题是FrameLayout似乎经常消失。有时它从应用程序开始就消失了,有时它会在我点击顶部工具栏上的按钮时消失。当它消失后,我可以通过旋转手机或在顶部工具栏上滑动来显示它。我将CoordinatorLayout着色用于调试目的,我可以清楚地看到,有时WebView会按预期填充空间,但WebView通常是不可见的。

我想,当我删除

时,问题不会发生
  

应用程式:layout_behavior = “@串/ appbar_scrolling_view_behavior”

来自FrameLayout的

。但是当然滚动不能按预期工作。 也许值得注意的是,我们的碎片已经

  

setRetainInstance(真)

集。 有人能告诉我,我怎么解决这个问题?以下是文件:

CoordinatorLayout 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>

WebViewFragment xml

<?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);
}

1 个答案:

答案 0 :(得分:0)

我可以通过更改

来解决此问题
  

编译'com.android.support:design:24.2.0'

  

编译'com.android.support:design:24.1.0'

在我的app.gradle文件中。