AppBarLayout/Toolbar 未显示(高度 = 0)
AppBarLayout/Toolbar not showing (height = 0)
我正在开发一个应用程序来显示有关 movie/tv 节目的详细信息。从搜索结果中打开电影时,它会正确打开。然后我将电影添加到我的 collection,转到列出我所有电影的 MainActivity。选择同一部电影,但现在整个 AppBarLayout 都被隐藏了!我没有得到任何类型的异常,在调试中我看到它是可见的,但高度为 0。为什么会这样?
如果找不到横幅图像,我有一个折叠 CollapsingToolbarLayout 的方法,但这里不是这种情况。无论如何,它应该在折叠时有一个带标题的工具栏,并在滚动时展开。
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。甚至一些我没有搜索过的电影。
很抱歉,如果这个问题变成 long/detailed,但我经常看到人们要求提供更多详细信息,因此我选择尽可能多地包含我认为必要的相关信息。
如果您需要更多信息,请告诉我?
我想通了!
我正在使用 Ion 进行图像加载,并且有一个回调方法 "collapseAppBarOnError":
private FutureCallback<ImageView> collapseAppBarOnError() {
return new FutureCallback<ImageView>() {
@Override
public void onCompleted(Exception e, ImageView result) {
stopLoading();
if (e != null && !(e instanceof CancellationException)) {//TODO: Denne vil ikke funke om errorDrawable ligger i cache?
collapse();
} else if (result != null && result.getDrawable() != null && !result.getDrawable().equals(getDrawable(R.drawable.ic_movie_white_48dp))) {
expand();
}
}
};
}
问题出在回调方法中的"else if"。抱歉,当我没有发布所有代码时,你们不可能看到这一点。
事实证明它实际上与 SearchActivity 无关,如果我打开我 collection 中已有的电影两次或更多次,即使不使用搜索也会发生错误!它第一次正常工作,但以后就不行了。
我正在开发一个应用程序来显示有关 movie/tv 节目的详细信息。从搜索结果中打开电影时,它会正确打开。然后我将电影添加到我的 collection,转到列出我所有电影的 MainActivity。选择同一部电影,但现在整个 AppBarLayout 都被隐藏了!我没有得到任何类型的异常,在调试中我看到它是可见的,但高度为 0。为什么会这样?
如果找不到横幅图像,我有一个折叠 CollapsingToolbarLayout 的方法,但这里不是这种情况。无论如何,它应该在折叠时有一个带标题的工具栏,并在滚动时展开。
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。甚至一些我没有搜索过的电影。
很抱歉,如果这个问题变成 long/detailed,但我经常看到人们要求提供更多详细信息,因此我选择尽可能多地包含我认为必要的相关信息。
如果您需要更多信息,请告诉我?
我想通了! 我正在使用 Ion 进行图像加载,并且有一个回调方法 "collapseAppBarOnError":
private FutureCallback<ImageView> collapseAppBarOnError() {
return new FutureCallback<ImageView>() {
@Override
public void onCompleted(Exception e, ImageView result) {
stopLoading();
if (e != null && !(e instanceof CancellationException)) {//TODO: Denne vil ikke funke om errorDrawable ligger i cache?
collapse();
} else if (result != null && result.getDrawable() != null && !result.getDrawable().equals(getDrawable(R.drawable.ic_movie_white_48dp))) {
expand();
}
}
};
}
问题出在回调方法中的"else if"。抱歉,当我没有发布所有代码时,你们不可能看到这一点。
事实证明它实际上与 SearchActivity 无关,如果我打开我 collection 中已有的电影两次或更多次,即使不使用搜索也会发生错误!它第一次正常工作,但以后就不行了。