我模仿别人的知乎日报,新闻列表页没问题,内容明细页(NewsDetail)用的是ViewPager+Fragment。可以左右滑动看左右的新闻的。
我的项目地址是链接描述
但是我在做顶部可折叠式标题栏的时候有个问题,从新闻列表中点击新闻进去的新闻页面的Toolbar是不对的,但是比如说往右边滑一个就是正常的,再右边滑一个也正常,然后左滑动两次回到第一次打开的新闻页面,Toolbar就正常了。。很奇怪,模拟器7.1.1和真机Nexus6(7.0)上都是一样的问题。
图片的顺序是点击第一个新闻后----上滑到出现Toolbar----右滑到第二个新闻,上滑到Toolbar,正常
那个Toolbar又正常了。(如果Toolbar不正常,那返回按钮和分享按钮就按不了,如果正常,则这两个按钮可以按),我是这样想的,右滑页面能出现正常显示,包括Toolbar能正常,说明布局文件没问题。
2.
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()));
}
}