android 可折叠标题栏,ViewPager + Fragment + 折叠式标题栏异常

我模仿别人的知乎日报,新闻列表页没问题,内容明细页(NewsDetail)用的是ViewPager+Fragment。可以左右滑动看左右的新闻的。

我的项目地址是链接描述

但是我在做顶部可折叠式标题栏的时候有个问题,从新闻列表中点击新闻进去的新闻页面的Toolbar是不对的,但是比如说往右边滑一个就是正常的,再右边滑一个也正常,然后左滑动两次回到第一次打开的新闻页面,Toolbar就正常了。。很奇怪,模拟器7.1.1和真机Nexus6(7.0)上都是一样的问题。

图片的顺序是点击第一个新闻后----上滑到出现Toolbar----右滑到第二个新闻,上滑到Toolbar,正常

那个Toolbar又正常了。(如果Toolbar不正常,那返回按钮和分享按钮就按不了,如果正常,则这两个按钮可以按),我是这样想的,右滑页面能出现正常显示,包括Toolbar能正常,说明布局文件没问题。

2.

bVR3Hl?w=612&h=1088

bVR3Hj?w=1080&h=1920

bVR3Jf?w=1080&h=1920

1460000010462268

3.activity_news_detail.xml

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:id="@+id/activity_news_detail_view_pager"

android:layout_height="match_parent"

tools:context="com.lance.lancezhihudaily.ui.activity.NewsDetailActivity">

fragment_news_detail.xml

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"

android:fitsSystemWindows="ture">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:fitsSystemWindows="true">

android:id="@+id/collapsing_toolbar_layout"

android:layout_width="match_parent"

android:layout_height="256dp"

android:fitsSystemWindows="true"

android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"

app:contentScrim="@color/colorPrimary"

app:expandedTitleMarginEnd="96dp"

app:expandedTitleTextAppearance="@style/CollapsingToolbarTitleStyle"

app:layout_scrollFlags="scroll|exitUntilCollapsed">

android:layout_width="match_parent"

android:layout_height="match_parent"

android:fitsSystemWindows="true"

app:layout_collapseMode="parallax"

app:layout_collapseParallaxMultiplier="0.8"

app:layout_scrollFlags="scroll|snap|enterAlways|enterAlwaysCollapsed">

android:id="@+id/image_view_header"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:contentDescription="@null"

android:scaleType="centerCrop"/>

android:id="@+id/text_view_title"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_gravity="bottom"

android:layout_marginBottom="16dp"

android:padding="16dp"

android:textColor="@android:color/white"

android:textSize="22sp"

tools:text="@string/news_detail_text_title"/>

android:id="@+id/text_view_source"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="end|bottom"

android:padding="8dp"

android:textColor="#A1FFFFFF"

android:textSize="13sp"

tools:text="@string/news_detail_text_source"/>

android:id="@+id/news_detail_toolbar"

android:layout_width="match_parent"

android:layout_height="?attr/actionBarSize"

android:minHeight="?attr/actionBarSize"

app:layout_collapseMode="pin"/>

android:id="@+id/nestedScrollView"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:scrollbars="vertical"

app:layout_behavior="@string/appbar_scrolling_view_behavior">

android:id="@+id/web_view"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:isScrollContainer="false"

android:scrollbars="vertical"/>

android:id="@+id/floatingActionButton"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_margin="16dp"

android:src="@drawable/fav_normal"

android:theme="@style/MyFloatingButton"

app:layout_anchor="@id/nestedScrollView"

app:layout_anchorGravity="bottom|end"/>

NewsDetailActivity.java

public class NewsDetailActivity extends AppCompatActivity {

public static final String EXTRA_NEWS = "com.lance.lancezhihudaily.mNews";

public static final String EXTRA_NEWS_LIST = "com.lance.lancezhihudaily.news_list";

private ViewPager mViewPager;

private News mNews;

private List mNewsList;

public static void start(Context context, News news, List newsList) {

Intent intent = new Intent(context, NewsDetailActivity.class);

intent.putExtra(EXTRA_NEWS, news);

intent.putExtra(EXTRA_NEWS_LIST, (Serializable) newsList);

context.startActivity(intent);

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_news_detail_pager);

mViewPager = (ViewPager) findViewById(R.id.activity_news_detail_view_pager);

mNews = (News) getIntent().getSerializableExtra(EXTRA_NEWS);

mNewsList = (List) getIntent().getSerializableExtra(EXTRA_NEWS_LIST);

FragmentManager fragmentManager = getSupportFragmentManager();

FragmentStatePagerAdapter fragmentStatePagerAdapter = new FragmentStatePagerAdapter(fragmentManager) {

@Override

public Fragment getItem(int position) {

News news = mNewsList.get(position);

return NewsDetailFragment.newInstance(news);

}

@Override

public int getCount() {

return mNewsList.size();

}

};

mViewPager.setAdapter(fragmentStatePagerAdapter);

setCurrentItem();

}

private void setCurrentItem() {

for (int i = 0; i < mNewsList.size(); i++) {

if (mNewsList.get(i).getId() == (mNews.getId())) {

mViewPager.setCurrentItem(i);

break;

}

}

}

}

NewsDetailFragment.java

public class NewsDetailFragment extends Fragment implements View.OnClickListener {

private static final String ARG_NEWS = "mNews";

private CollapsingToolbarLayout mCollapsingToolbarLayout;

private ImageView mImageViewHeader;

private TextView mTextViewTitle;

private TextView mTextViewSource;

private Toolbar mToolbarNewsDetail;

private FloatingActionButton mFloatingFavorite;

private WebView mWebView;

public News mNews;

public NewsDetail mNewsDetail;

private DBDao mDBDao;

private boolean isFavorite = false;

public static NewsDetailFragment newInstance(News news) {

Bundle args = new Bundle();

args.putSerializable(ARG_NEWS, news);

NewsDetailFragment newsDetailFragment = new NewsDetailFragment();

newsDetailFragment.setArguments(args);

return newsDetailFragment;

}

@Override

public void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setHasOptionsMenu(true);

mNews = (News) getArguments().getSerializable(ARG_NEWS);

mDBDao = new DBDao(getActivity());

}

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment_news_detail, container, false);

mCollapsingToolbarLayout = (CollapsingToolbarLayout) view.findViewById(R.id.collapsing_toolbar_layout);

mImageViewHeader = (ImageView) view.findViewById(R.id.image_view_header);

mTextViewTitle = (TextView) view.findViewById(R.id.text_view_title);

mTextViewSource = (TextView) view.findViewById(R.id.text_view_source);

mToolbarNewsDetail = (Toolbar) view.findViewById(R.id.news_detail_toolbar);

mFloatingFavorite = (FloatingActionButton) view.findViewById(R.id.floatingActionButton);

mWebView = (WebView) view.findViewById(R.id.web_view);

isFavorite = mDBDao.isFavorite(mNews);

if (isFavorite) {

mFloatingFavorite.setImageResource(R.drawable.fav_active);

} else {

mFloatingFavorite.setImageResource(R.drawable.fav_normal);

}

return view;

}

@Override

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {

super.onViewCreated(view, savedInstanceState);

initCollapsingToolBar();

initDetail();

}

//初始化界面

private void initDetail() {

if (NetworkCheck.checkNetWorkConnection(MyApp.getContext())) {

RetrofitManager.builder()

.getNewsDetail(mNews.getId())

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Consumer() {

@Override

public void accept(@NonNull NewsDetail newsDetail) throws Exception {

mNewsDetail = newsDetail;

loadNewsDetailData();

}

});

} else {

NetworkCheck.noNetworkAlert(getContext());

}

}

//设置WebView

private void setWebView(WebView webView) {

webView.getSettings().setJavaScriptEnabled(true);

webView.setVerticalScrollBarEnabled(false);

webView.setHorizontalScrollBarEnabled(false);

}

//折叠标题栏的加载

private void initCollapsingToolBar() {

AppCompatActivity activity = (AppCompatActivity) getActivity();

activity.setSupportActionBar(mToolbarNewsDetail);

ActionBar actionBar = activity.getSupportActionBar();

if (actionBar != null) {

actionBar.setDisplayHomeAsUpEnabled(true);

}

mCollapsingToolbarLayout.setTitleEnabled(true);

}

//加载newsDetail数据的方法

public void loadNewsDetailData() {

Glide.with(getContext())

.load(mNewsDetail.getImage())

.into(mImageViewHeader);

mTextViewTitle.setText(mNewsDetail.getTitle());

mTextViewSource.setText(mNewsDetail.getImage_source());

mWebView.setDrawingCacheEnabled(true);

String htmlData = HtmlUtil.createHtmlData(mNewsDetail);

mWebView.loadData(htmlData, HtmlUtil.MIME_TYPE, HtmlUtil.ENCODING);

setWebView(mWebView);

//设置FloatingButton的点击监听器

mFloatingFavorite.setOnClickListener(this);

}

//FloatingButton的点击后实现的逻辑

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.floatingActionButton:

if (isFavorite) {

mDBDao.deleteFavorite(mNews);

mFloatingFavorite.setImageResource(R.drawable.fav_normal);

isFavorite = false;

} else {

mDBDao.insertFavorite(mNews);

mFloatingFavorite.setImageResource(R.drawable.fav_active);

isFavorite = true;

}

break;

default:

break;

}

}

//

@Override

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

menu.clear();

inflater.inflate(R.menu.news_detail_toolbar,menu);

}

//actionbar的点击

@Override

public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {

case android.R.id.home:

getActivity().onBackPressed();

return true;

case R.id.action_bar_share:

share();

return true;

}

return super.onOptionsItemSelected(item);

}

//分享功能

private void share() {

Intent intent = new Intent(Intent.ACTION_SEND);

intent.setType("text/plain");

intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.share));

intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.share_from) + mNews.getTitle() + ",http://daily.zhihu.com/story/" + mNews.getId());

startActivity(Intent.createChooser(intent, mNews.getTitle()));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值