目录:
知识点:
4.1 碎片是什么
碎片(Fragment)是一种可以嵌人在活动当中的uI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用得非广泛。虽然碎片对你来说应该是个全新的概念,但我相信你学习起来应该毫不费力,因为它和活动实在是太像了,同样都能包含布局,同样都有自己的生命周期。你甚至可以将碎片理解成一一个迷 你型的活动,虽然这个迷你型的活动有可能和普通的活动是一样大的。
4.2 碎片的使用方式
4.2.1 碎片的简单用法
首先在Activity中创建 fragment
这里我们通过name 属性来显式指明要添加的碎片类名
<fragment
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:id="@+id/frag_list"
android:name="com.dak.administrator.firstcode.tablet_device.ListFragment"
/>
而后创建ListFragment类
public class ListFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_list,container,false);
return super.onCreateView(inflater, container, savedInstanceState);
}
}
<LinearLayout 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="com.dak.administrator.firstcode.tablet_device.ListFragment">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/recy"
>
</android.support.v7.widget.RecyclerView>
</LinearLayout>
如此即可
4.2.2 动态添加碎片
创建待添加的碎片实例
获取到FragmentManager,调用getFragmentManager()方法得到。
调用beginTransaction()开启一个事物。
向内容器加入碎片,使用replace()实现(传入容器的id和待添加碎片的实例)
用commit(),提交事务。
FragmentManager fragmentManager = getSupportFragmentManager();
android.support.v4.app.FragmentTransaction transaction=fragmentManager.beginTransaction();
transaction.replace(R.id.frame_frag, new ListFragment());
transaction.commit()
4.2.3 在碎片中模拟返回栈
在commit之前,加入addToBackStack()方法。
此时按下返回键,可以回到上一个碎片。
4.2.4 碎片和活动之间进行通信
在活动中得到相应碎片的实例,调用FragmentManager的findFragmentById。
在碎片中获取当前活动实例,MainActivity activity = (MainActivity)getActivity();
4.3 碎片的生命周期
碎片除了Activity中的生命周期外,还有:
onAttach() 碎片和活动建立关系时调用。
onCreateView() 加载碎片布局
onActivityCreated() 碎片和活动创建完毕时调用。
onDestoryView() 当与碎片关联视图被移除的时候调用。
onDetach() 碎片和活动解除关系时调用。
4.3.1 碎片的状态和回调
运行状态:当一个碎片可见,并且它所关联的活动正处于运行状态时,该碎片也处于运行状态
暂停状态:当一个活动进入暂停状态时(由于另一个未占满屏幕的活动被添加到了栈顶)与它相关联的可见碎片就会进人到暂停状态。
停止状态: 当一个活动进入停止状态时,与他相关的相关联的碎片就会进人到停止状态,或者通过调用FragmentTransaction的remove(),replace()方法将碎片从活动中移除,但如果在事务提交之前调动addToBackStack() 方法,这时的碎片也会进入停止状态。总的来说,进入停止状态的碎片对用户来说是完全不可见的,有可能会被系统回收。
销毁状态:碎片总是依附于活动而存在的,因此当活动被销毁时,与它相关联的碎片就会进人到销毁状态。或者通过调用FanentTransaction的remove()、replace()方法将碎片 从活动中移除,但在事务提交之前并没有调用addToBackStack()方法,这时的碎片也会进人到销毁状态。结合之前的活动状态,相信你理解起来应该毫不费力吧。同样地,Fragment 类中也提供了一系列的回调方法, 以覆盖碎片生命周期的每个环节。其中,活动中有的回调方法,碎片中几乎都有,不过碎片还提供了些附加的回调方法, 那我们就重点看一下这几个回调。
- onAttach() 当碎片和活动建立关联的时候调用。
- onCreateView() 为碎片创建视图(加载布局)时调用。
- onActivityCreated() 确保与碎片相关联的活动一定已经创建完毕 的时候调用。
- onDestroyView() 当与碎片关联的视图被移除的时候调用。
- onDetach()。 当碎片和活动解除关联的时候调用。
4.3.2 体验碎片的生命周期
完整:
onAttach()
onCreate()
onCreateView()
onActivityCreated()
onStart()
onResume()
onPause()
onStop()
onDestory()
onDetach()
4.4 动态加载布局的技巧
新建layout-large文件夹,(双页模式,两个布局),大屏幕就会加载这个布局
小屏幕就会加载 另一个布局
4.4.1 使用限定符
在res目录下新建layout-large,新建一个同样的布局 比如说 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:id="@+id/frag_list"
android:name="com.dak.administrator.firstcode.tablet_device.ListFragment"
/>
<FrameLayout
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent">
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/frag_details"
android:name="com.dak.administrator.firstcode.tablet_device.DetailsFragment"
/>
</FrameLayout>
</LinearLayout>
原layout 目录下的activity_main.xml 布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="horizontal"
tools:context="com.dak.administrator.firstcode.tablet_device.MainActivity">
<fragment
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:id="@+id/frag_list"
android:name="com.dak.administrator.firstcode.tablet_device.ListFragment"
/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/frame_frag"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_1"
/>
</FrameLayout>
</LinearLayout>
可以看到,layout/activity_main 布局只包含了一个碎片,即单页模式,而layout-large/activity_main布局包含了两个碎片,即双页模式,其中large就是一个限定符
- small:提供给小屏幕的资源
- normal:提供给中等屏幕的资源
- large:提供给大屏幕的资源
- xlarge:提供给超大屏幕的资源
- land:提供给横屏设备的资源
- port:提供给竖屏设备的资源
4.4.2 使用最小宽度限定符
最小宽度限定符允许我们对屏幕的宽度制定一个最小值(以dp为单位),然后以这个为临界点,大于这个值得设备就加在一个布局,小于这个值得设备就加在另一个布局
我们同样在res目录下新建 layout-sw600dp 意味着,当程序运行在屏幕宽度大于600dp的设备上时,便会加在当下目录下的布局。
4.5 碎片的最佳实践——一个简易版的新闻应用
https://blog.csdn.net/u013678930/article/details/50834702
4.6 小结与点评
郭霖总结:
你应该可以感觉到,上一节中我们开发的新闻应用, 代码复杂度还是有点高的,比起只需要兼容一 个终端的应用,我们要考虑的东西多了很多。不过在开发的过程中多付出一些,在以后的代码维护中就可以轻松很多。因此,有时候提前的付出还是很值得的。
我们再来回顾一下 本章所学的内容吧,首先你了解了碎片的基本概念以及使用场景,接着通过几个实例掌握了碎片的常见用法,随后又学习了碎片生命周期的相关内容以及动态加载布局的技巧,最后在本章的最佳实践部分将前面所学的内容综合运用了一遍,相信你已经将碎片相关知识点都牢记在心,并可以较为熟练地应用了。
本章其实是具有一个里程碑式的纪念意 义的,因为到这里为止,我们已经基本将AndroidUI相关的重要知识点都讲完了。后面在很长-段时间内都不会再系统性地介绍Ul方面的知识,而是将结合前面所学的u知识来更好地讲解相应章节的内容。那么我们下一直将要学习什么呢?还记再在第章里介绍过的Adoid四大组件吧?目前我们只掌握了活动这一个组件,那么下一章就来学习广播接收器吧。跟上脚步,准备继续前进!
我的总结:
这一章内容还是很有必要去记住的,虽然在我的工作当中去进行平板适配的内容比较少,但是这仍然是不可避免的。当我们的应用越做越大的时候,难免会去进行平板的适配。