AppBarLayout /工具栏未显示(height = 0)

时间:2016-11-11 14:21:13

标签: android android-actionbar android-toolbar android-collapsingtoolbarlayout

我正在开发一个应用程序来显示有关电影/电视节目的详细信息。从搜索结果中打开电影时,它会正确打开。然后我将电影添加到我的收藏中,转到MainActivity,其中列出了我的所有电影。选择相同的电影,但现在隐藏整个AppBarLayout!我没有得到任何类型的例外,在调试中我看到它是可见的,但是高度为0.为什么会发生这种情况?

如果没有找到横幅图像,我有一个折叠CollapsingToolbarLayout的方法,但这不是这里的情况。无论如何,它应该在折叠时具有带标题的工具栏,并在滚动时展开。

Correctly displayed AppBarLayout not visible

DetailActivity的布局:

<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:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:theme="@style/AppTheme.NoActionBar"
tools:context=".activites.DetailActivity">

<android.support.design.widget.AppBarLayout
    android:id="@+id/app_bar"
    android:layout_width="match_parent"
    android:layout_height="240dp"
    android:fitsSystemWindows="true"
    android:theme="@style/AppTheme.AppBarOverlay"
    app:layout_behavior="@string/appbar_spring_behavior">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/toolbar_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:contentScrim="?attr/colorPrimary"
        app:expandedTitleMarginBottom="60dp"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <ImageView
            android:id="@+id/banner"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:contentDescription="@null"
            android:fitsSystemWindows="true"
            android:focusableInTouchMode="true"
            android:scaleType="centerCrop"
            app:layout_collapseMode="parallax" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

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

<android.support.design.widget.NestedFixFlingScrollView
[...]

DetailActivity中的一些相关设置方法:

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail);
    movieChanges = InterfaceHolder.movieChanges;
    findNodes();
    setupToolbar();
    setupCurrentMovie();
    setupImageGallery();
    setupFAB();

    displayDetails();
    fetchTmdbDetails();
}

private void setupToolbar() {
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    if (getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
    getWindow().setStatusBarColor(Color.TRANSPARENT);
    setTitleWhenCollapsed();
}

private void setupCurrentMovie() {
    movie = new Gson().fromJson(getIntent().getStringExtra(EXTRA_MOVIE), Movie.class);
    if (movie == null) {
        Toast.makeText(this, R.string.movie_not_found, Toast.LENGTH_SHORT).show();
        finish();
    }
}
[...]

从搜索结果中启动DetailActivity:

holder.listItemContainer.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (resultModel.searchResult.isTvShow() || resultModel.searchResult.isMovie()) {
                final Movie movie = new Movie();
                movie.setTitle(resultModel.displayText);
                movie.setYear(resultModel.year);
                movie.setFormat(MovieFormat.BLU_RAY);
                movie.setType(MediaType.from(resultModel.mediaType));
                movie.setPosterPath(resultModel.posterUrl);
                movie.setTmdbId(resultModel.searchResult.getId());
                final Intent intent = new Intent(context, DetailActivity.class);
                intent.putExtra(DetailActivity.EXTRA_MOVIE, new Gson().toJson(movie));
                context.startActivity(intent);
            }
        }
    });

从MainActivity开始:

final Movie movie = movieList().get(position);
final Intent intent = new Intent(getApplicationContext(), DetailActivity.class);
intent.putExtra(DetailActivity.EXTRA_MOVIE, new Gson().toJson(movie));
startActivity(intent);

styles.xml:

<resources>

<style name="AppTheme" parent="Theme.AppCompat">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="android:windowBackground">@drawable/background_splash</item>
</style>

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

styles.xml-21:

<resources>

<style name="AppTheme21" parent="AppTheme">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

SearchActivitiy和DetailActivity都使用AppTheme.NoActionBar。 MainActivity使用AppTheme。我现在注意到,当从SearchActivity打开电影时,它正确显示,但如果我按回(搜索)然后再次打开同一部电影,则无法正确显示。

我怀疑是SearchActivity中的这一行造成了麻烦,但事实并非如此:

getSupportActionBar().hide();

似乎只有在使用SearchActivity之后,DetailActivity才能正确显示。 MainActivity中的所有其他示例数据在DetailActivity中正确打开,直到我使用了SearchActivity。甚至一些我没有搜索过的电影。

很抱歉,如果这个问题变得冗长/详细,但我经常看到人们要求提供更多细节,所以我选择包含尽可能多的相关信息。

如果您需要更多信息,请告诉我?

1 个答案:

答案 0 :(得分:0)

我明白了! 我正在使用Ion进行图像加载,并且有一个回调方法“collapseAppBarOnError”:

.navbar {
    background:rgba(0, 0, 0, 0.65);
}

回调方法中的“else if”导致了麻烦。对不起,因为当我没有发布我的所有代码时,你们不可能看到。

事实证明它实际上与SearchActivity无关,如果我在我的收藏中打开了两次或更多次的电影,即使没有使用搜索,也会发生错误!它第一次正常工作,但不是以下时间。