Android Fragment实践之简易的新闻应用
基本概念
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实践之简易的新闻应用相关推荐
- Android实现一个简易的新闻列表APP(TabLayout+ViewPager+Fragment)
Android实现一个简易的新闻列表APP(TabLayout+ViewPager+Fragment) 文章目录 Android实现一个简易的新闻列表APP(TabLayout+ViewPager+F ...
- Android学习笔记五—简易新闻应用设计
由于平板Pad屏幕尺寸一般都比较大,在展示内容时,可以同时展示更多信息,如左侧是导航列表,右侧是具体内容(双页模式).而手机,因为屏幕尺寸限制,只能显示一部分信息,或者是左侧导航列表,或者是右侧具体内 ...
- 【转】 Android Fragment 真正的完全解析(下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和 ...
- Android Fragment 真正的完全解析(下)
本篇将介绍上篇博客提到的:如何管理Fragment回退栈,Fragment如何与Activity交互,Fragment与Activity交互的最佳实践,没有视图的Fragment的用处,使用Fragm ...
- Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...
- android fragment学习4-底部布局扩展TabLayout
我的博客 Fragment学习3–底部tab布局 https://blog.csdn.net/qq_26296197/article/details/81146319 布局结构 用的是google比较 ...
- Android Fragment 真正彻底的解决(下一个)
转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因.以及一些主要的使用方 ...
- Android Fragment 真正的完全解析
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 Hongyang 目录视图 摘要视图 订阅 有奖征资源,博文分享有 ...
- Android Fragment 真正的完全解析(上)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37970961 自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fra ...
最新文章
- FreeImage加速保存图像
- oracle中的一些基本概念
- js(Dom+Bom)第七天(1)
- robotframework调用python类方法_RobotFramework-调用.py文件
- HDOJ1879(继续畅通工程)
- 202.linux系统相关函数
- 重置Mysql自增列的开始序号
- 自动驾驶 9-3: 走向非线性 - 扩展卡尔曼滤波器 Going Nonlinear - The Extended Kalman Filter
- 资料:基于MPSOC XCZU15EG-2FFVB1156I 的PCIe FMC 光纤接口处理卡设计资料保存
- BT源代码学习心得(十):客户端源代码分析(相关对象一览) -- 转贴自 wolfenstein (NeverSayNever)
- 量化交易之单因子策略
- 12 搜索之DSL--基础查询
- 万年历的黎明:全部结束
- HackTheBox-Baby RE
- 钉钉企业内部开发报错notInDingTalk
- python3 opencv 基于二值化图像素投影的图片切割方法
- 棋类对战小游戏(VS2012 MFC基于对话框)
- android:orientation = quot;horizontalquot; 和 android:orientation = quot;verticalquot;
- 如何进行win8的蓝牙虚拟串口设置
- 小程序毕设作品之微信运动场地预约小程序毕业设计(7)中期检查报告
热门文章
- 怎么安装nerworkx_ubuntu 安装networkx
- LUTU科技-Android 环境模式 Ambient Mode 手机变智能屏幕列出重要资讯
- 控制面板里打印服务器显示叹号,控制面板显示设备上有叹号怎么回事?
- 结对编程,合适的人真的很少,志趣相投的人很少
- 读Google Borg
- 多个application.yml
- OPC(ole for process control)技术论坛
- 汶川地震活下来的猪坚强,商标被疯狂抢注!
- Linux常用命令——time命令
- 在项目中使用 vuepress 搭建组件文档 报错 Uncaught ReferenceError: global is not defined