而一般平板电脑屏幕的大小会在7英寸到10英寸之
分类:美高梅网上注册平台

现如今移动设备的发展非常的迅速,手机和平板都非常的普及了。这两者的差距除了屏幕的大小以外,其他的差距都非常的小。我们知道一般的手机的屏幕是4-6英寸,平板一般是7-10英寸。屏幕大小的差距会让同样的界面的视觉效果有较大的差异。有些控件会被过分的拉伸,元素之间的排列空隙变大,图片的效果失真。

平板电脑和手机最大的区别就是屏幕的大小不同,一般手机屏幕的大小会在3英寸到6英寸之间,而一般平板电脑屏幕的大小会在7英寸到10英寸之间。屏幕大小差距过大有可能会让同样的界面在视觉效果上有较大的差异,比如一些界面在手机上看起来非常美观,但在平板电脑上看起来就可能会有控件被过分拉长、元素之间空隙过大等情况。

本篇文章主要介绍以下几个知识点:

  • 碎片 fragment 的用法;
  • 碎片 fragment 的生命周期;
  • 动态加载布局的技巧,限定符的使用;
  • 实战:简易版的新闻应用。

Android自从3.0开始引入Fragment,它可以让界面在平板上更好的显示。Fragment是一种可以镶嵌在Activity当中的UI片段。它可以让程序更加合理充分的利用大屏幕的空间。因此在平板上应用非常的普遍。在你对Actiivty有过了解之后,你再来了解Fragment的话,简单了很多,他们之间很多地方都非常的相像。你甚至可以说Fragment是Activity的翻版。因为我们知道,平板的屏幕比手机的屏幕要大。程序员在设计的时候就得兼顾手机和平板。假设我们在开发今日头条的新闻App,一个界面展示一组的新闻标题,另外一个界面展示新闻的内容。现在手机开发,可以是两个Activity,一个Activity展示标题,一个Activity展示内容。那么如果是平板呢?新闻的标题在手机界面上能展示出来,在平板是当然也可以,但是你能容忍还有一大片空白以及标题被拉伸么?这时候就得用上碎片了,使用两个碎片分别放置标题和内容,再将这两个碎片引入到同一个活动里。这样屏幕控件就被充分利用了么。如下图所示:

作为一名Android开发人员,能够同时兼顾手机和平板的开发是我们必须做到的事情,Android 3.0版本开始引入了碎片的概念,它可以让界面在平板上更好地展示,下面我们就来学习一下。

图片来源于网络

图片 1碎片的使用

1. 碎片是什么

碎片和活动非常像,都能包含布局,同样都有自己的生命周期,是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用得非常广泛。那如何使用碎片充分利用平板屏幕的空间呢?

想象我们正在开发一个新闻应用。其中一个界面使用recyclerview展示一组新闻标题,当点击了其中一个标题时,就打开另一个界面显示新闻的详细内容。如果是在手机中设计,我们可以将新闻标题列表放在一个活动中,将新闻的详细内容放在另一个活动中。但是平板屏幕太大,这样设计肯定不合理,会导致界面上有大量的空白区域。

因此更好的设计方案是将新闻标题列表界面和新闻详细内容界面分别放在两个碎片中,然后在同一个活动中引入这两个碎片,这样就可以将屏幕空间充分地利用起来了。

4.1 碎片是什么

碎片(Fragment)是一种可以嵌入在活动当中的 UI 片段,它能让程序更加合理和充分 地利用大屏幕的空间,因而在平板上应用的非常广泛。

那么究竟要如何使用碎片才能充分地利用平板屏幕的空间呢?想象我们正在开发一个新闻应用,其中一个界面使用 RecyclerView 展示了一组新闻的标题,当点击了其中一个标题,就打开另一个界面显示新闻的详细内容。若是在手机中设计,我们可以将新闻标题列表放在 一个活动中,将新闻的详细内容放在另一个活动中,如图所示:

手机的设计方案

但显示在平板上,那么新闻标题列表将会被拉长至填充满整个平板的屏幕,而新闻的标题一般都不会太长,这样将会导致界面上有大量的空白区域,如图所示:

平板的新闻列表

因此,更好的设计方案是将新闻标题列表界面和新闻详细内容界面分别放在两个碎片中,然后在同一个活动里引入这两个碎片,这样就可以将屏幕空间充分地利用起来了,如图所示:

平板的双页设计

3.1 碎片的简单用法

在一个活动中添加两个碎片,并让这两个碎片平分活动空间。left_fragment.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="left_Fragment"/></LinearLayout>

接着新建一个LeftFragment类继承Fragment。注意,这里可能会有两个不同的包下的Fragment可以选择。一个是系统内置的android.app.Fragment,一个是support-v4库下的android.support.v4.app.Fragment。这里强烈建议你用V4包下的Fragment,因为它可以在所有的Android系统版本中保持功能的一致性。而系统包下的Fragment在4.2之前的设备不能使用。在使用的时候,不需要在build.gradle文件中添加support-v4库的依赖,builder.gradle文件中添加了appcompat_v7库的依赖,包括了support_v4库。

public class LeftFragment extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view=inflater.inflate(R.layout.left_fragment,container, false); return view; }}

right_fragment.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffff00"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="right_fragment" android:textSize="20sp" /></LinearLayout>

right的写法与left都一样。然后修改activity_main.xml。之前讲过设置权重,然后就是通过使用<fragment>标签在布局中添加碎片。最后还有设置android:name 属性,来指明需要添加的碎片全包名。项目结果如下图所示:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.demo.fragmentdemo.MainActivity"> <fragment android: android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:name="com.demo.fragmentdemo.LeftFragment"/> <fragment android: android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:name="com.demo.fragmentdemo.RightFragment"/></LinearLayout>

图片 2fragment

2. 在碎片中模拟返回栈

    private void replaceFragment(Fragment fragment) {
        FragmentManager fragmentmanager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentmanager.beginTransaction();
        transaction.replace(R.id.right_layout,fragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }

*** 重新运行程序,并点击按钮将AnotherRightFragment添加到活动中,然后按下Back键,就会跳转到RightFragment界面,继续按下Back键,RightFragment界面也会消失。

4.2 碎片的使用方式

3.2 碎片的高级用法

1.上面只是讲了碎片在布局文件中的用法,碎片的真正强大之处在于他可以在程序中动态的添加到Activity当中。新建代码new_right_fragment:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00ff00"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="新的Fragment" android:textSize="20sp" /></LinearLayout>

2.新建Fragment,NewRightFragment继承 Fragment

public class NewRightFragment extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view=inflater.inflate(R.layout.new_right_fragment,container,false); return view; }}

3.修改activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.demo.fragmentdemo.MainActivity"> <fragment android: android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:name="com.demo.fragmentdemo.LeftFragment"/> <FrameLayout android: android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent"/></LinearLayout>

之前的文章介绍了FrameLayout,所有的控件默认放在左上角。这里只有一个碎片,不需要任何定位,非常适合FrameLayout。4.修改MainActivity,这里我们设计通过点击左边的碎片的按钮,实现右边的碎片进行替换。最后设置点击Back键,返回之前的碎片。

public class MainActivity extends AppCompatActivity implements OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button=  findViewById(R.id.button); button.setOnClickListener; replaceFragment(new RightFragment; } @Override public void onClick { switch ){ case R.id.button: replaceFragment(new NewRightFragment; break; default: break; } } private void replaceFragment(Fragment fragment){ FragmentManager fragmentManager=getSupportFragmentManager(); FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.right_layout,fragment); fragmentTransaction.addToBackStack; fragmentTransaction.commit(); }}

可以看到,首先我们给左侧的碎片中的按钮button注册了点击事件,然后调用 replaceFragment()这个方法来动态替换掉右边的fragment。换成NewRightFragment。结合代码可以看到:1.创建带添加的代码实例2.获取FragmentManager,可以在Activity中直接调用getSupportFragmentManager()方法得到3.开启一个事务。通过调用beginTransaction()的方法开启4.向容器内添加或替换碎片。一般使用replace()方法实现,需要传入容器的id,和待添加的碎片实例。5.在提交事务之前,调用FragmentTransaction 的addToBackStack()的方法,它可以接受一个名字用于描述返回栈的状态,一般传入null就可以了。点击Back键,你会发现程序没有退出,会回退到上一层RightFragment,再点击一次,RightFreagment界面会消失,再点一次,才会退出程序。

6.提交事务,调用commit()的方法效果如下图所示:

图片 3fragment的动态添加

我们知道碎片是镶嵌在活动Activity中显示的,但是他们之间的关系并不是特别的亲密。从上面的代码中,你可以看出Fragment和Actiivty都各自存在一个类中。哪么他们之间有没有明显的方式来直接通信呢?肯定是有的。

为了方便碎片和活动之间进行通信,FragmentManager提供了一个类似于findviewbyId的方法来从布局文件中获取碎片的实例,代码如下:

RightFragment right=(RightFragment) getSupportFragmentManager().findFragmentById(R.id.right_fragment);

通过FragmentManager的findFragmentById可以在活动中得到相应的碎片的实例。然后调用碎片里面的方法。

因为我们知道碎片是嵌入到活动中的,那么每个碎片想要获取对象和的Activity的方法就非常简单了,只需要调用getActivity()的方法来获取和当前碎片相关的实例就可以了。

MainActivity activity =(MainActivity) getActivity();

这样就获取到了活动的实例,有了活动的实例就好办了,你可以随便调用这个活动的方法。另外当碎片需要使用Context对象的时候,也可以使用getActivity()的方法。因为获取的活动本身就是一个Context对象。

看到这里,我和你说碎片和碎片之间不能通信,你是不是一板砖直接拍过来的啊。好好说话不动手。咳咳,这个 碎片都是在活动中的,每个碎片都是独立的fragment,那么如果fragment之间想要通信怎么办?当然是找爸爸啊,啊不对,是找Activity的。一个活动首先得得到它相关联的活动,然后通过它的活动再去过去另一个碎片的实例。这样就可以实现碎片之间的通信功能了。

看到生命周期是不是很熟悉啊,都说了 Fragment是嵌入到Activity中的,Activity有生命周期,Fragment也肯定会有的啊。来,看图说话:

图片 4生命周期的对比

联想一下Activity的生命周期,它在生命周期内一会共有 运行状态,暂停状态,停止状态和销毁四种状态。所以fragment也有这四种状态,在一些小的地方会有所差别。

1.运行状态当一个碎片可见的时候,并且所关联的Activity正处在运行状态中,该碎片也处于运行状态。2.暂停状态当Activity进入暂停的状态时,与它相关的可见的碎片就会进入暂停状态3.停止状态当一个活动进入停止状态,与它相关联的碎片就会进入到停止状态,或者通过调用Fragment中的FragmentTransaction()的remove(),replace的方法将碎片从活动中移除,但是如果在事务提交之前调用addToBackStack()方法的话,碎片也会进入到停止状态。总的来说,进入停止的碎片对用户来说是不可见的,有可能会被回收掉。4.销毁状态碎片依附于活动,活动被销毁了,碎片也要被销毁。Fragment中的FragmentTransaction在提交事务之前调用remove(),replace()的方法将碎片从活动中移除。但是事务提交之前没有调用addToBackStack()的方法的话,碎片也会进入销毁状态。碎片的几个附加的回调方法:1.onAttach() 当碎片和活动简历关联的时候,调用2.onCreateView() 碎片加载布局的时候调用3.onActivityCreated() Activity已经创建的时候调用4.onDestoryView() 与碎片相关联的activity被移除的时候调用5.onDetch() 当碎片和活动解除关联的时候调用

将RightFragment的生命周期方法加上

public class RightFragment extends Fragment { private static final String TAG = "RightFragment"; @Override public void onAttach(Context context) { super.onAttach; Log.d(TAG, "onAttach: "); } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "onCreate: "); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { Log.d(TAG, "onCreateView: "); View view=inflater.inflate(R.layout.right_fragment,container,false); return view; } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.d(TAG, "onActivityCreated: "); } @Override public void onStart() { super.onStart(); Log.d(TAG, "onStart: "); } @Override public void onResume() { super.onResume(); Log.d(TAG, "onResume: "); } @Override public void onPause() { super.onPause(); Log.d(TAG, "onPause: "); } @Override public void onStop() { super.onStop(); Log.d(TAG, "onStop: "); } @Override public void onDestroyView() { super.onDestroyView(); Log.d(TAG, "onDestroyView: "); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy: "); } @Override public void onDetach() { super.onDetach(); Log.d(TAG, "onDetach: "); }}

然后继续代码,点击fragment左边的button,替换右边的fragment,然后点击Back键回退。

图片 5打印日志

1.通过日志发现,在运行项目代码的时候,第一次启动项目,会调用onAttach() , onCreate() , onCreateView(),onActivityCreated(),onStart(),onResume()方法,然后点击左边的fragment的按钮,日志改变,调用了onPause() , onStop(),onDestoryView(),这时候RightFragment已经被停止了。因为调用了addToBackStack()方法,如果没有调用会被销毁。onDestory()和onDetach()方法会得到执行。2.接着,点击Back键,RightFragment重新回到了屏幕,这时候重新调用了onCreateView(),onActivityCreated(),onStart(),onResume()方法。因为借助addToBackStack(),RightFragment方法没有被销毁,所以不会执行onCreate()方法。3.最后,再次点击Back键依次执行 onPause() , onStop() , onDestoryView() , onDestory() , onDetach() 方法。这样完整体验了一遍Fragment的生命周期了。

因为我们知道,同样的布局,手机放一个,平板可以放两个。假如程序能够根据设备的分辨率或者屏幕大小来判定加载哪个布局,那样我们发挥的控件就更多了,这里说点小技巧

很多平板都采用双页模式(左侧显示列表,右侧显示内容),因为屏幕大,能放得下,但是手机屏幕小,放不下,只能显示一页的内容,这时候咋办?举个栗子:1.新建activity_main3.xml的文件

<LinearLayout xmlns:andro android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android: android:layout_width="match_parent" android:layout_height="match_parent" android:name="com.demo.fragmentdemo.LeftFragment"/></LinearLayout>

2.然后在res目录下创建一个layout_larger包,再新建一个activity_main2.xml的文件。如果创建了包,但是文件无法创建的,是因为没有对包做引用。可以参考我的这篇文章:Android Studio 创建一个layout_large文件。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <fragment android: android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:name="com.demo.fragmentdemo.LeftFragment"/> <fragment android: android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:name="com.demo.fragmentdemo.RightFragment"/></LinearLayout>

这时候我们可以看到layout/activity_main2 布局只包含了一个碎片,而layout_larger/activity_main2布局包括了两个布局。其中large就是一个限定符,哪些屏幕被认为是large的设备会自动加载layout_large文件夹下的布局。小屏幕则会加载layout下的布局。效果如下图所示:

图片 6手机显示效果图图片 7平板显示效果图

我们使用了Large解决单双页的问题,但是我们不知道到底屏幕多大才符合large呢,这时候可以使用最小宽度限定符。同样的方法创建layout_sw600dp文件夹,创建activity_main2.xml文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android: android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:name="com.demo.fragmentdemo.LeftFragment"/> <fragment android: android:layout_width="0dp" android:layout_weight="3" android:layout_height="match_parent" android:name="com.demo.fragmentdemo.RightFragment"/></LinearLayout>

这就意味着,当程序运行在屏幕宽度大于600dp的时候,回家在layout_sw600dp/activity_main2这个文件,屏幕小于600的时候仍然会加载layout/activity_main2.xml文件。好了,关于fragment的一些用法就差不多了。

最后奉上github地址:

3. 碎片的使用方式

  • 静态加载
  1. 启动平板模拟器,新建FramentTest项目,创建两个布局left_fragment和right_fragment

left_fragment

<?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">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Button" />

</LinearLayout>

right_fragment

<?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:background="#00ff00"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="This is right fragment"
        android:textSize="20sp" />

</LinearLayout>
  1. 新建两个类LeftFragment和RightFragment:

LeftFragment

public class LeftFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  
    Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.left_fragment,container,false);
        return view;
    }
}

RightFragment

public class RightFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  
    Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.right_fragment,container,false);
        return view;
    }
}

注意:LeftFragment和RightFragment继承Fragmnet。这个Fragment可能会有两个不同包下的Fragment供选择,一个是系统内置的android.app.Fragment,一个是support-v4库中的android.support.v4.app.Fragment.这里强烈建议使用support-v4库中的Fragment,因为它可以让碎片在所有Andrid系统版本中保持功能一致性。比如说Fragment中嵌套使用Fragment,这个功能是在Android 4.2系统中才开始支持的。如果你使用的是系统内置的Fragment,那么很遗憾,4.2系统之前的设备运行你的程序就会崩溃。而使用support-v4库中的Fragment就不会出现这个问题,只要你保证使用 是最新的support-v4库就可以了。

  1. activity_main中引入frament:
<?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="horizontal">

    <fragment
        android:id="@+id/left_fragment"
        android:name="com.beidou.fragmenttest.LeftFragment"
        android:layout_width="0dip"
        android:layout_height="match_parent"
        android:layout_weight="1"></fragment>

    <fragment
        android:id="@+id/right_fragment"
        android:name="com.beidou.fragmenttest.RightFragment"
        android:layout_width="0dip"
        android:layout_height="match_parent"
        android:layout_weight="1"></fragment>
</LinearLayout>

注意:我们使用了<fragment>标签在布局中添加碎片,其中指定的大多数属性都熟悉,只不过还需要通过android:name属性来显示指明要添加的碎片类名,注意一定也要将类的包名也加上。

  • 动态加载
  1. 在原有的项目的基础上继续完善,新建another_right_fragment.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:background="#ffff00"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="This is another right fragment"
        android:textSize="20sp" />
</LinearLayout>

**** 布局的内容和right_fragment内容基本相同,只是将背景色改成了黄色,并将显示的文字改了改。

  1. 新建AnotherRightFragment,进行填充布局:
public class AnotherRightFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.another_right_fragment,container,false);
        return view;
    }
}
  1. 修改activity_main.xml,添加FrameLayout布局
<?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="horizontal">

    <fragment
        android:id="@+id/left_fragment"
        android:name="com.beidou.fragmenttest.LeftFragment"
        android:layout_width="0dip"
        android:layout_height="match_parent"
        android:layout_weight="1"></fragment>

    <FrameLayout
        android:id="@+id/right_layout"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"></FrameLayout>
</LinearLayout>
  1. 向rameLayout布局中动态添加碎片,修改Main_Activity中的代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
        replaceFragment(new RightFragment());
    }

    private void replaceFragment(Fragment fragment) {
        FragmentManager fragmentmanager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentmanager.beginTransaction();
        transaction.replace(R.id.right_layout,fragment);
        transaction.commit();
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.button:
                replaceFragment(new AnotherRightFragment());
                break;
        }
    }
}

**** 首先我们给左侧碎片中的按钮注册了一个点击事件,然后调用replaceFragment方法动态添加了RightFragment这个碎片。当点击左侧碎片中的按钮时,又会调用 replaceFragment方法将RightFragment碎片替换成AnotherRightFragment。

  1. 从以上可以看出动态添加代码主要分为5步:
    ① 创建待添加的碎片实例。
    ② 获取FragmentManager,在活动中可以直接调用getSupportFragmentManager方法得到。
    ③ 开启一个事务,通过调用beginTransaction方法开启。
    ④ 向容器内添加或者替换碎片,一般使用replace方法实现,需要传入容器的id和待添加的碎片实例。
    ⑤ 提交事务,调用commit方法来完成。

4.2.1 碎片的简单用法

这里我们准备先写一个最简单的碎片示例来练练手,在一个活动当中添加两个碎片,并让这两个碎片平分活动空间。
新建一个左侧碎片布局 fragment_left.xml,代码如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="按钮"/>

</LinearLayout>

这个布局非常简单,只放置了一个按钮,并让它水平居中显示。然后新建右侧碎片布局fragment_right.xml,代码如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#00ff00">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="20sp"
        android:text="这是右边的fragment"/>

</LinearLayout>

可以看到,我们将这个布局的背景色设置成绿色,并放置了一个 TextView 用于显示一段文本。

接着新建一个 LeftFragment 类,继承自 Fragment。注意,这里可能会有两个不同包 下的 Fragment 供你选择,一个是系统内置的android.app.Fragment,一个是 support-v4 库中的 android.support.v4.app.Fragment 。这里强烈建议使用 support-v4 库中的 Fragment,因为它可以让碎片在所有 Android 系统版本中保持功能一致性。

LeftFragment 的代码如下所示:

public class LeftFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_left, container, false);
        return view;
    }
}

这里仅仅是重写了 Fragment 的 onCreateView()方法,然后在这个方法中通过 LayoutInflater 的 inflate()方法将刚才定义的 fragment_left 布局动态加载进来,整个方法简单明了。接着我们用同样的方法再新建一个 RightFragment:

public class RightFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                          Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_right, container, false);
        return view;
    }
}

接下来修改 activity_fragment.xml 中的代码,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <fragment
        android:id="@+id/fragment_left"
        android:name="com.wonderful.myfirstcode.inquiry_fragment.LeftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

    <fragment
        android:id="@+id/fragment_right"
        android:name="com.wonderful.myfirstcode.inquiry_fragment.RightFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

</LinearLayout>

可以看到,我们使用了<fragment>标签在布局中添加碎片,通过 android:name 属性来显式指明要添加的碎片类名,注意一 定要将类的包名也加上。

这样最简单的碎片示例就已经写好了,运行一下程序,(平板上)效果如图:

碎片的简单运行效果

本文由美高梅网上注册平台发布于美高梅网上注册平台,转载请注明出处:而一般平板电脑屏幕的大小会在7英寸到10英寸之

上一篇:没有了 下一篇:工厂模式UML.png,工厂模式使用工厂方法代替
猜你喜欢
热门排行
精彩图文