ViewPager + Fragment + 折叠式标题栏异常

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

我的项目地址是链接描述

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

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

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

2.![图片描述

图片描述

图片描述

7.png

3.activity_news_detail.xml

<android.support.v4.view.ViewPager
    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">
</android.support.v4.view.ViewPager>

fragment_news_detail.xml

<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"
    android:fitsSystemWindows="ture">

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

        <android.support.design.widget.CollapsingToolbarLayout
            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">

            <FrameLayout
                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">

                <ImageView
                    android:id="@+id/image_view_header"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:contentDescription="@null"
                    android:scaleType="centerCrop"/>

                <TextView
                    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"/>

                <TextView
                    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"/>
            </FrameLayout>

            <android.support.v7.widget.Toolbar
                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.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView
        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">

        <WebView
            android:id="@+id/web_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:isScrollContainer="false"
            android:scrollbars="vertical"/>
    </android.support.v4.widget.NestedScrollView>

    <android.support.design.widget.FloatingActionButton
        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"/>

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

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<News> mNewsList;

    public static void start(Context context, News news, List<News> 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<News>) 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<NewsDetail>() {
                        @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()));
    }
}
阅读 2.9k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题