第一行代码——第四章:手机平板要兼顾——探究碎片

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lhk147852369/article/details/84345202

目录:

4.1 碎片是什么

4.2 碎片的使用方式

4.2.1 碎片的简单用法

4.2.2 动态添加碎片

4.2.3 在碎片中模拟返回栈

4.2.4 碎片和活动之间进行通信

4.3 碎片的生命周期

4.3.1 碎片的状态和回调

4.3.2 体验碎片的生命周期

4.4 动态加载布局的技巧

4.4.1 使用限定符

扫描二维码关注公众号,回复: 4796657 查看本文章

4.4.2 使用最小宽度限定符

4.5 碎片的最佳实践——一个简易版的新闻应用

4.6 小结与点评


知识点:

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四大组件吧?目前我们只掌握了活动这一个组件,那么下一章就来学习广播接收器吧。跟上脚步,准备继续前进!

我的总结:

这一章内容还是很有必要去记住的,虽然在我的工作当中去进行平板适配的内容比较少,但是这仍然是不可避免的。当我们的应用越做越大的时候,难免会去进行平板的适配。

猜你喜欢

转载自blog.csdn.net/lhk147852369/article/details/84345202
今日推荐