一、摘要
今天工作那么久第一次加班,加班的目的修改已完成大部分的新闻列表的接口,早上一个上午在思考如何在Activity和Fragment之间传递值,Google搜索了一下发现,使用setArguments()和getArguments()方法可以实现,但是集合到现有的掌声平桂APP开发中,一直报错,调试一次次都没法解决,干脆不做了,心烦。。。
二、查看官方Demo
Google的官方Demo介绍如何使用FragmentPagerAdapter在一个Activity中添加多个Fragment,这些Fragment之间除了传递的参数不一样外,展示的样式和布局都是一样的,有一种恍然一醒的感觉,以前自己的做法是每个Fragment创建一个类,如果有四个Fragment就创建四个,这样做显得有点多余,在官网的Demo里面只有一个Fragment,同时可以在一个ViewPager中创建了无数个Fragment,处理的思路:1、首先创建一个Fragment模板,2、在Fragment构造方法中传递不同的参数,3、重复创建多个Fragment
于是改变一下以往的思路,根据官网提供的做法,自己先创建了一个Demo,项目的结构如下:
三、项目结构分析
PagerSlidingTabStrip:
这是一个网上别人封装好的一个自定义View,该类的作用——实现新闻头部拖动或手势滑动切换Fragment的效果,在布局文件activity_main中添加,如下图:
MainActivity:
主要的界面,初始化ViewPager、PagerSlidingTabStrip视图,同时设置ViewPager的FragmentPagerAdapter适配器,这一步设置创建多个Fragment,然后在Fragment设置UI界面。
WebViewFragment:
该类用于获取从MainActivity类传递过来的实参,然后展示,这里直接使用一个WebView控件加载网页,还可以像很多新闻一样获取后台新闻数据,然后排版成新闻列表的样式,如果之前你看过《Android开发之ListView添加多种布局效果演示》这篇文章,你会发现新闻列表之间其实就是多个Fragment,然后添加不同的新闻数据,所以WebViewFragment最终的样式效果,可以根据需要更改。
NewsBean:
这是一个新闻实体,添加了title和url两个属性,一个显示Fragment头部滚动的栏目,一个在WebViewFragment中加载TeachCourse博客栏目页面。
基本思路就是这样子,然后开始完善每个类的代码。再一次验证以前说过的一句话:编程的思路决定出路,有很多时候问题并不是真的很难解决,换个思路考虑,理清楚逻辑比你绞尽脑汁思考要重要得多,总结了那么多,发现还是一塌糊涂
四、代码实现
添加webview_fragment.xml布局代码:
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <WebView
- android:id="@+id/webview_id"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
- </RelativeLayout>
WebViewFragment重写onCreate()、onCreateView()两个方法,在构造方法中设置传入的参数,并在onCreateView()方法中获取
- public class WebViewFragment extends Fragment {
- String mUrlString;// Activity传递过来的url地址
- /**
- * 创建多个Fragment,根据传递的值
- *
- * @param url
- * @return
- */
- public static WebViewFragment newInstance(String url) {
- WebViewFragment fragment = new WebViewFragment();
- Bundle args = new Bundle();
- args.putString("url", url);
- fragment.setArguments(args);
- return fragment;
- }
- /**
- * 获取传递过来的URL地址
- *
- *
- *
- */
- @Override
- public void onCreate(@Nullable Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- mUrlString = getArguments() != null ? getArguments().getString("url")
- : "";
- }
- /*
- * 初始化布局,并显示URL地址对应的网页
- *
- */
- @Override
- @Nullable
- public View onCreateView(LayoutInflater inflater,
- @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
- super.onCreateView(inflater, container, savedInstanceState);
- View view=inflater.inflate(R.layout.webview_fragment, container,false);
- //获取WebView控件
- WebView mWebView=(WebView)view.findViewById(R.id.webview_id);
- WebSettings setting=mWebView.getSettings();
- setting.setJavaScriptEnabled(true);//设置支持JavaScript
- mWebView.setWebViewClient(new WebViewClient());
- mWebView.loadUrl(mUrlString);
- return view;
- }
- }
添加activity_main.xml布局代码:
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context="cn.teachcourse.main.MainActivity" >
- <RelativeLayout
- android:id="@+id/main_news_rr"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="visible" >
- <cn.teachcourse.main.view.PagerSlidingTabStrip
- android:id="@+id/tabs"
- android:layout_width="match_parent"
- android:layout_height="40dp" />
- <android.support.v4.view.ViewPager
- android:id="@+id/pager"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@+id/tabs" />
- </RelativeLayout>
- </RelativeLayout>
MainActivity类实现:
- 在该类中添加了MyPagerAdapter内部类继承FragmentPagerAdapter,必须重写getCount()和getItem()方法两个方法,在getItem()中调用WebViewFragment中newInstance()返回一个Fragment,这一步是是关键,当前getCount()返回的个数决定创建Fragment的个数
- 初始布局文件,获取控件ViewPager、PagerSlidingTabStrip,并添加ViewPager的适配器MyPagerAdapter
- pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
- 设置PagerSlidingTabStrip的一些基本属性(通用的代码,不理解也没关系)
- tabs.setViewPager(pager);
- // 设置Tab是自动填充满屏幕的
- tabs.setShouldExpand(true);
- // 设置Tab的分割线是透明的
- tabs.setDividerColor(Color.TRANSPARENT);
- // 设置Tab底部线的高度
- tabs.setUnderlineHeight((int) TypedValue.applyDimension(
- TypedValue.COMPLEX_UNIT_DIP, 1, dm));
- // 设置Tab Indicator的高度
- tabs.setIndicatorHeight((int) TypedValue.applyDimension(
- TypedValue.COMPLEX_UNIT_DIP, 4, dm));
- // 设置Tab标题文字的大小
- tabs.setTextSize((int) TypedValue.applyDimension(
- TypedValue.COMPLEX_UNIT_SP, 16, dm));
- // 设置Tab Indicator的颜色
- tabs.setIndicatorColor(Color.parseColor("#9c231b"));
- // 设置选中Tab文字的颜色 (这是我自定义的一个方法)
- tabs.setSelectedTextColor(Color.parseColor("#9c231b"));
- // 取消点击Tab时的背景色
- tabs.setTabBackground(0);
- Demo使用一个工作线程获取NewsBean实体数据,如果你需要获取服务器数据,子线程是必须的,防止阻塞主线程,具体代码:
- private void setValues() {
- Runnable run = new Runnable() {
- @Override
- public void run() {
- mList.add(new NewsBean("Android移动开发",
- "https://www.teachcourse.cn/cat/android"));
- mList.add(new NewsBean("Android Studio",
- "https://www.teachcourse.cn/cat/android-studio"));
- mList.add(new NewsBean("Genymotion",
- "https://www.teachcourse.cn/cat/android/android-genymotion"));
- mList.add(new NewsBean("Eclipse",
- "https://www.teachcourse.cn/cat/android/android-eclipse"));
- mList.add(new NewsBean("忘不掉的旅行", "http://go.teachcourse.cn/"));
- mHandler.sendEmptyMessage(MESSAGE_REFRESH);
- }
- };
- mHandler.post(run);
- }
NewsBean实体类:
- public class NewsBean implements Serializable {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String title;
- private String url;
- public NewsBean(String title, String url) {
- super();
- this.title = title;
- this.url = url;
- }
- public String getTitle() {
- return title;
- }
- public void setTitle(String title) {
- this.title = title;
- }
- public String getUrl() {
- return url;
- }
- public void setUrl(String url) {
- this.url = url;
- }
- }
五、manifest添加权限
访问网络需要添加如下权限:
- <uses-permission android:name="android.permission.INTERNET"/>
六、推荐阅读:
你可能感兴趣的文章
转载请注明出处: https://www.teachcourse.cn/1590.html ,谢谢支持!