美文网首页
Fragment 基础

Fragment 基础

作者: 努力学习的安同学 | 来源:发表于2018-04-02 15:17 被阅读0次

1. Fragment碎片

  • Fragment是一种可以嵌入在活动当中的UI片段,是程序合理、充分的利用大屏幕的空间,多数使用在平板上,和活动类似,同样包含布局,同样拥有自己的生命周期。可以将Fragment理解成一个迷你的Activity。
  • 其中使用fragment的库,建议使用android.support.v4.app.Fragment

2. Fragment使用方式

  • Fragment主要分为静态添加和动态添加两种方式。

2.1 静态添加

  • 静态添加方式很简单,主要是在主Activity中添加<fragment></fragment>组件,然后将此组件添加android:name属性来显示添加知名要添加的碎片的类名,注意一定要将类的包名也加上。
  • 摘抄《第一行代码》中的例子,其中添加代码的例子:
  1. 新建一个左侧的碎片布局left_fragment.xml,代码如下:
<
  1. 在上面布局添加了一个按钮,并居中显示,然后新建一个右侧的碎片布局right_fragment.xml,代码如下:
<
  1. 这个布局只是增加了一个TextView,然后将这个背景色添加成绿色。
  2. 布局已经构建完了,紧接着新建一个LeftFragment类,并继承Fragment。使用support-v4库中的Fragment,代码如下所示:
public class LeftFragment extends Fragment {
  @Override
  public View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInstanceState) {
    View view = inflater.inflater(R.layout.left_fragment, container, flase);
    return view;
  }
}
  1. 这里仅仅是重写了Fragment的onCreateView()方法,然后在这个方法中通过LayoutInflater的inflater()方法将刚才定义的Left_fragment布局动态加载进来,简单明了。
  2. 接着新建一个RightFragment,代码如下所示:
public class RightFragment extends Fragment {
  @Override 
  public View 
}
  1. 以上代码基本相同,都是加载一个新的Fragment布局,接下来修改activity_main.xml中的代码,如下所示:

  1. 运行后可以看到,使用<fragment>标签在布局中添加碎片,大部分都为正常添加的属性,只是在主布局中添加<fragment>标签组件,在该组件中通过android:name属性来显示指明要添加的碎片的类名,一定要添加该类的包名。

2.2 动态添加

  • 上文中添加的fragment主要为静态的添加,但是fragment的功能还可以实现在程序运行的时候,动态的添加到活动当中,根据具体情况动态的添加碎片,就可以将程序界面定制的多样化。
  • 动态添加fragment需要添加一个<FrameLayout>组件,同时在主工程中需要实例化一个FragmentManager管理类,同时调用beginTransaction()方法开启。
  1. 基于静态添加fragment代码,新建another_right_fragment.xml,代码如下所示:

  1. 这个布局和right_fragment.xml的代码基本相同,只是将背景色改成了黄色,然后将显示的文字响应的修改。
  2. 新建AnotherRightFragment作为另一个右侧碎片,代码如下所示:

  1. 代码同样简单,在onCreateView()方法中加载了创建的another_right_fragment布局,准备好了另一个碎片,然后将其动态的添加到activity_main.xml,代码如下所示:

  1. 可以看到,将右侧的碎片替换成了一个<FrameLayout>的组件,该控件默认都会摆放在布局的左上角。
  2. 将在FrameLayout中添加内容,从而实现动态太耐碎片的功能,修改MainActivity中的代码,如下所示:

  1. 首先给左侧碎片中的button注册了一个点击事件,然后调用了replaceFragment()方法添加了RightFragment这个碎片。当点击左侧的button时,调用replaceFragment()方法中的代码。
  • 总结动态添加fragment总共分5步:
    1. 创建带添加碎片的布局和实例;
    2. 获取FragmentManager,在活动中可以直接通过调用getSupportFragmentManager()方法得到;
      FragmentManager fragmentManager = getSupportFragmentManager();
    3. 开启一个事物,通过调用beginTransaction()方法开启;
      FragmentTransaction transaction = fragmentManager.beginTransaction();
    4. 向容器内添加或替换碎片,一般使用replace()方法实现,需要传入容器的id和带甜阿吉的碎片实例;
      transaction.replace(R.id.right_layout, fragment);
    5. 提交事物,调用commit()方法来完成。这样就完成了在活动中添加碎片的功能。
      transaction.commit();

2.3 Fragment模拟返回栈

  • 上文主要实现了在活动中动态添加碎片的功能,但是存在一个bug,就是在点击按钮添加了一个fragment之后,这个时候按下back键程序就会直接退出,这里想模仿类似于返回栈的效果,在按下back返回键的时候,可以会推倒上一个碎片。
  • 其中主要的实现原理为在FragmentTransaction中提供了一个addToBackStack()方法,可以将一个事物添加到返回栈中。
  1. 实现添加事物到返回栈中,代码如下:

  1. 上面代码主要在事务调用commit()方法提交之前,调用了FragmentTransaction的addToBackStack()方法,它可以接收一个名字用于描述返回栈的状态,一般传入null即可。
  2. 运行该程序,点击button键,将AnotherRightFragment添加到活动中,然后按下back键,你会发现程序没有退出,而是回到了RightFragment界面,继续按下back键,RightFragment界面也会消失,再次按下Back键,程序才会退出。

2.4 Fragment和Activity之间的通信

  • fragment都为嵌入Activity中显示的,但是两者关系并没有太多的相关。可以从代码中看出,fragment和Activity都是各自存在一个独立的类中的,他们之间并没有明显的方式来进行直接进行通信。如果想要在Activity中调用fragment里的方法,或者在fragment中调用Activity里的方法,还是通过FragmentManager提供的方法实现。
  • 主要调用FragmentManager提供一个类似于findViewById()的方法。专门从布局文件中获取碎片的实例,代码如下:
    RightFragment rightFragment = (RightFragment)getFragmentManager().findFragmentById(R.id.right_fragment);
  1. 调用Fragment的findFragmentById()方法,可以在活动中得到相应的fragment的实例,然后就可以轻松调用fragment中的方法了。
  2. 掌握在Activity中调用fragment的方法,在fragment中调用Activity的方法,每个fragment都可以通过调用getActivity()方法来的到和当前碎片相关联的活动实例,代码如下所示:
    MainActivity activity = (MainActivity)getActivity();
  3. 有了活动实例之后,在碎片中调用活动里的方法就变得轻而易举了,另外当碎片中需要使用Context对象时,也可以使用getActivity()方法,因为获取到的活动本身就是一个Context对象。
  4. 如何结局fragment和fragment之间的通信,主要的思路为,在一个fragment中可以获取到与它相关联的Activity,然后通过这个Activity去获取另一个fragment的实例,这样就可以实现不同的fragment之间的通信功能。

相关文章

网友评论

      本文标题:Fragment 基础

      本文链接:https://www.haomeiwen.com/subject/kfuthftx.html