基本概念

Fragment,简称碎片,是Android 3.0(API 11)提出的,为了兼容低版本,support-v4库中也开发了一套Fragment API,最低兼容Android 1.6。

过去support-v4库是一个jar包,24.2.0版本开始,将support-v4库模块化为多个jar包,包含:support-fragment, support-ui, support-media-compat等,这么做是为了减少APK包大小,你需要用哪个模块就引入哪个模块。

如果想引入整个support-v4库,则compile 'com.android.support:support-v4:24.2.1',如果只想引入support-fragment库,则com.android.support:support-fragment:24.2.1

  • Fragment是依赖于Activity的,不能独立存在的。
  • 一个Activity里可以有多个Fragment。
  • 一个Fragment可以被多个Activity重用。
  • Fragment有自己的生命周期,并能接收输入事件。
  • 我们能在Activity运行时动态地添加或删除Fragment。

Fragment的优势有以下几点:

  • 模块化(Modularity):我们不必把所有代码全部写在Activity中,而是把代码写在各自的Fragment中。
  • 可重用(Reusability):多个Activity可以重用一个Fragment。
  • 可适配(Adaptability):根据硬件的屏幕尺寸、屏幕方向,能够方便地实现不同的布局,这样用户体验更好。

Demo:FragmentBestPractice兼容平板和手机的一个简易的新闻应用

View层:

双页模式下新闻内容部分的布局:news_fragment_frag.xml:

<?xml version="1.0" encoding="utf-8"?>
<!--新闻内容布局-->
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:id="@+id/visibility_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:visibility="invisible"><TextViewandroid:id="@+id/news_title"android:gravity="center_horizontal|center_vertical"android:layout_width="match_parent"android:layout_height="50dp" /><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#000"/><TextViewandroid:id="@+id/news_content"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:padding="15dp"android:textSize="18sp"/></LinearLayout><Viewandroid:layout_width="1dp"android:layout_height="match_parent"android:layout_alignParentLeft="true"android:background="#000"android:layout_alignParentStart="true" />
</RelativeLayout>

单页模式下新闻内容部分的布局activity_news_content.xml:

<?xml version="1.0" encoding="utf-8"?>
<!--单页新闻内容布局-->
<LinearLayoutxmlns: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:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".Control.NewsContentActivity"><fragmentandroid:id="@+id/news_content_fragment"android:name="com.example.dpl.fragmentbestpractice.Control.NewsContentFragment"android:layout_width="match_parent"android:layout_height="match_parent"/>
</LinearLayout>

两种模式下共用新闻标题列表的布局news_title_frag.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><android.support.v7.widget.RecyclerViewandroid:id="@+id/news_title_recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center_horizontal"android:background="#1C1C1C" />
</LinearLayout>

 新闻标题列表的子布局news_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/news_title"android:layout_width="match_parent"android:layout_height="wrap_content"android:maxLines="1"android:ellipsize="end"android:textSize="25sp"android:textColor="#fff"android:paddingRight="10dp"android:paddingLeft="10dp"android:paddingBottom="15dp"android:paddingTop="15dp"/>

单页模式下,只加载一个新闻标题的碎片布局:activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<!--单页模式页面碎片-->
<FrameLayout 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/news_title_layout"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".Control.MainActivity"><fragmentandroid:id="@+id/news_title_fragment"android:name="com.example.dpl.fragmentbestpractice.Control.NewsTitleFragment"android:layout_height="match_parent"android:layout_width="match_parent"/></FrameLayout>

通过限定符的方式系统区分运行的大屏幕还是小屏幕,新建适配大屏幕的布局文件夹layout-sw600dp,在其下创建activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<!--双页模式页面碎片-->
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"android:baselineAligned="false"><fragmentandroid:id="@+id/news_title_fragment"android:name="com.example.dpl.fragmentbestpractice.Control.NewsTitleFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><FrameLayoutandroid:id="@+id/news_content_layout"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="3"><fragmentandroid:id="@+id/news_content_fragment"android:name="com.example.dpl.fragmentbestpractice.Control.NewsContentFragment"android:layout_width="match_parent"android:layout_height="match_parent"/></FrameLayout>
</LinearLayout>

Model层:

新闻类:News.java

public class News {private String title;private String content;public void setContent(String content) {this.content = content;}public String getContent() {return content;}public void setTitle(String title) {this.title = title;}public String getTitle() {return title;}
}

Control层:

创建两种模式下共用新闻内容的Fragment:NewsContentFragment.java:

public class NewsContentFragment extends Fragment {private View view;@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {view=inflater.inflate(R.layout.news_content_frag,container,false);//获取布局return view;}/*** 将新闻内容和标题显示到界面上*/public void refresh(String newsTitle,String newsContent){View visibilityLayout=view.findViewById(R.id.visibility_layout);//获取子布局visibilityLayout.setVisibility(View.VISIBLE);//布局设置为可见TextView newsTitleText= (TextView) view.findViewById(R.id.news_title);TextView newsContentText= (TextView) view.findViewById(R.id.news_content);newsTitleText.setText(newsTitle);//刷新标题newsContentText.setText(newsContent);//刷新内容}
}

单页模式下引用其上Fragment的Activity:NewsContentActivity.java:

public class NewsContentActivity extends AppCompatActivity {public static void actionStart(Context context,String newsTitle,String newsContent){Intent intent=new Intent(context,NewsContentActivity.class);intent.putExtra("news_title",newsTitle);intent.putExtra("news_content",newsContent);context.startActivity(intent);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_news_content);String newsTitle=getIntent().getStringExtra("news_title");//获取标题String newsContent=getIntent().getStringExtra("news_content");//获取内容NewsContentFragment newsContentFragment= (NewsContentFragment) getSupportFragmentManager().findFragmentById(R.id.news_content_fragment);newsContentFragment.refresh(newsTitle,newsContent);//刷新NewsContentFragment界面}
}

两种模式下新闻标题部分的碎片NewsTitleFragment.java:

public class NewsTitleFragment extends Fragment {private boolean isTwoPane;@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.news_title_frag, container, false);RecyclerView newsTitleRecyclerView= (RecyclerView) view.findViewById(R.id.news_title_recycler_view);LinearLayoutManager manager=new LinearLayoutManager(view.getContext());newsTitleRecyclerView.setLayoutManager(manager);NewsAdapter newsAdapter=new NewsAdapter(getNews());newsTitleRecyclerView.setAdapter(newsAdapter);return view;}private List<News> getNews() {//初始化标题列表List<News> newsList=new ArrayList<>();for (int i=1;i<=50;i++){News news=new News();news.setTitle("This is the title"+i);news.setContent(getRandomLengthContent("This is new content"+i+","));newsList.add(news);}return newsList;}private String getRandomLengthContent(String content){//随机添加内容Random random=new Random();int length=random.nextInt(20)+1;StringBuilder builder=new StringBuilder();for (int i=0;i<length;i++){builder.append(content);}return builder.toString();}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);if (getActivity().findViewById(R.id.news_content_layout) != null) {isTwoPane = true; //可以找到news_content_layout时,显示双页模式} else {isTwoPane = false;//找不到new_content_layout时,显示单页模式}}class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> {private List<News> mNewsList;class ViewHolder extends RecyclerView.ViewHolder {TextView newsTitleText;public ViewHolder(@NonNull View itemView) {super(itemView);newsTitleText = (TextView) itemView.findViewById(R.id.news_title);}}private NewsAdapter(List<News> newsList) {mNewsList = newsList;}@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull final ViewGroup viewGroup, final int i) {View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.news_item, viewGroup, false);final ViewHolder holder = new ViewHolder(view);view.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {News news = mNewsList.get(holder.getAdapterPosition());if (isTwoPane) {//如果是双页模式,刷新NewsContentFragment内容NewsContentFragment newsContentFragment = (NewsContentFragment) getFragmentManager().findFragmentById(R.id.news_content_fragment);newsContentFragment.refresh(news.getTitle(), news.getContent());} else {//如果是单页模式,直接启动NewsContentActivityNewsContentActivity.actionStart(getActivity(), news.getTitle(), news.getContent());}}});return holder;}@Overridepublic void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {News news=mNewsList.get(i);viewHolder.newsTitleText.setText(news.getTitle());}@Overridepublic int getItemCount() {return mNewsList.size();}}
}

主活动MainActivity.java:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}

运行效果:

         

Github  源码

Android Fragment实践之简易的新闻应用相关推荐

  1. Android实现一个简易的新闻列表APP(TabLayout+ViewPager+Fragment)

    Android实现一个简易的新闻列表APP(TabLayout+ViewPager+Fragment) 文章目录 Android实现一个简易的新闻列表APP(TabLayout+ViewPager+F ...

  2. Android学习笔记五—简易新闻应用设计

    由于平板Pad屏幕尺寸一般都比较大,在展示内容时,可以同时展示更多信息,如左侧是导航列表,右侧是具体内容(双页模式).而手机,因为屏幕尺寸限制,只能显示一部分信息,或者是左侧导航列表,或者是右侧具体内 ...

  3. 【转】 Android Fragment 真正的完全解析(下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和 ...

  4. Android Fragment 真正的完全解析(下)

    本篇将介绍上篇博客提到的:如何管理Fragment回退栈,Fragment如何与Activity交互,Fragment与Activity交互的最佳实践,没有视图的Fragment的用处,使用Fragm ...

  5. Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复

    Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...

  6. android fragment学习4-底部布局扩展TabLayout

    我的博客 Fragment学习3–底部tab布局 https://blog.csdn.net/qq_26296197/article/details/81146319 布局结构 用的是google比较 ...

  7. Android Fragment 真正彻底的解决(下一个)

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因.以及一些主要的使用方 ...

  8. Android Fragment 真正的完全解析

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 Hongyang 目录视图 摘要视图 订阅 有奖征资源,博文分享有 ...

  9. Android Fragment 真正的完全解析(上)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37970961 自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fra ...

最新文章

  1. FreeImage加速保存图像
  2. oracle中的一些基本概念
  3. js(Dom+Bom)第七天(1)
  4. robotframework调用python类方法_RobotFramework-调用.py文件
  5. HDOJ1879(继续畅通工程)
  6. 202.linux系统相关函数
  7. 重置Mysql自增列的开始序号
  8. 自动驾驶 9-3: 走向非线性 - 扩展卡尔曼滤波器 Going Nonlinear - The Extended Kalman Filter
  9. 资料:基于MPSOC XCZU15EG-2FFVB1156I 的PCIe FMC 光纤接口处理卡设计资料保存
  10. BT源代码学习心得(十):客户端源代码分析(相关对象一览) -- 转贴自 wolfenstein (NeverSayNever)
  11. 量化交易之单因子策略
  12. 12 搜索之DSL--基础查询
  13. 万年历的黎明:全部结束
  14. HackTheBox-Baby RE
  15. 钉钉企业内部开发报错notInDingTalk
  16. python3 opencv 基于二值化图像素投影的图片切割方法
  17. 棋类对战小游戏(VS2012 MFC基于对话框)
  18. android:orientation = quot;horizontalquot; 和 android:orientation = quot;verticalquot;
  19. 如何进行win8的蓝牙虚拟串口设置
  20. 小程序毕设作品之微信运动场地预约小程序毕业设计(7)中期检查报告

热门文章

  1. 怎么安装nerworkx_ubuntu 安装networkx
  2. LUTU科技-Android 环境模式 Ambient Mode 手机变智能屏幕列出重要资讯
  3. 控制面板里打印服务器显示叹号,控制面板显示设备上有叹号怎么回事?
  4. 结对编程,合适的人真的很少,志趣相投的人很少
  5. 读Google Borg
  6. 多个application.yml
  7. OPC(ole for process control)技术论坛
  8. 汶川地震活下来的猪坚强,商标被疯狂抢注!
  9. Linux常用命令——time命令
  10. 在项目中使用 vuepress 搭建组件文档 报错 Uncaught ReferenceError: global is not defined