Fragment 碎片的案例讲解

来源:互联网 发布:lua for mac 编辑:程序博客网 时间:2024/05/17 21:53

Fragment 碎片的案例讲解

概念

       碎片是可以嵌入在活动中的UI片段,它可以充分和合理的利用平板屏幕的空间。碎片也可称为mini型的活动,它跟活动一样可以拥有布局,也有着自己的生命周期。通过下面的例子简单理解一下:

       在一个新闻软件开发中,手机端设计思想是:其中一个界面使用RecyclerView显示新闻标题列表,当点击一条新闻标题,显示另一个界面新闻内容信息。这样我们可以将新闻 标题放在一个活动中,新闻内容信息放在另一个活动中。这样的设计思路如果用在平板上,在新闻标题显示是,会被拉长控件,控件内容会有很多留白,UI美观上会大大打折扣,因此手机端设计思路不能使用在平板上。

        在平板上,如果我们使用碎片思想如下设计:将新闻标题设计成一个碎片,新闻内容设计成一个碎片,两个碎片同时加载到一个活动中,这样就可以充分利用平板屏幕的空间了。


        接下来就以新闻软件为例来展示碎片在平板中的使用,并且对碎片有一个整体的理解。实现动态添加碎片和在碎片中模拟返回栈。


UI布局的设计

        为碎片设置布局,首先左侧碎片布局就是一个button按钮。右侧碎片布局是一个TextView 控件用来显示一段文字。为了实现动态添加碎片右侧创建两个碎片布局以背景颜色区分一个绿色,一个黄色。 代码如下:

left_fragment.xml

    



right_fragment.xml

    



another_right_fragment.xml


    

碎片类的创建

       接着为三个布局创建相应的碎片类,碎片类需要继承fragment,并且重写方法onCreateView(),在该方法中使用LayoutInflater.inflate()将碎片布局加载进来就可以了。


LeftFragment.java

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;    }}

RightFragment.java

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


AnotherRightFragment.java

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;    }}


注意: Fragment 碎片类 有两个包供你选择,一个是系统内置的dandroid.app.fragment, 一个是support-v4库中的android.support.v4.app.fragment。support-v4库不需要特别加入依赖引用,因为build.gradle文件中已有的appcompat-v7库在导入时,会将support-v4一起导入,所以不需要额外添加依赖。 强烈建议选择support-v4库中的android.support.v4.app.fragment, 因为该包中的类可以保证碎片功能在所有android系统上保持一致性,而系统内置的包在android4.2之前并不支持碎片嵌套碎片功能,support-v4则针对所有系统都支持。


Main 布局

       将碎片标签加入Activity_main.xml 布局中,在标签中需要通过android:name属性显示声明碎片类名,注意一定要将包名加上。另外新闻内容的布局我们放置一个FrameLayout来添加碎片,FrameLayout表示将添加的碎片布局以左上角显示非常适合放置一个空间的布局。

Activity_main.xml

        


活动的点击事件

      在MainActivity.java类中首先为左侧的新闻标题button按钮添加点击事件,然后创建一个replaceFragment(Fragment frag) 方法用来动态替换碎片,

      结合下面代码的分析实现动态添加碎片的步骤如下:

1. 创建要替换的碎片类。

2. 获取FragmentManager 类,在活动中可以通过getSupportFragmentManager ()得到。

3. 开启一个碎片事务FragmentTransaction, 通过FragmentManager的beginTransaction()方法获取。

4. 然后通过调用事务的replace方法,传入容器的id和碎片的实例对象。

5. 最后一步,就是提交事务。

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


在碎片中模拟返回栈

        通过上述代码,我们可以看见这样一行代码fragmentTransaction.addToBackStack(null);在事务提交之前添加的,这行代码就是用来模拟返回栈的,它可以接收一个名字用来描述返回栈的状态,一般传入null值。以上实例就到此结束了。 根据一个实例的演练,多少针对碎片有一个使用方面的认识。从使用方面来说它跟活动很类似,也拥有独立的类,同时也有跟活动类似的生命周期,这里描述一下碎片与活动之间的通信。碎片与活动之间的通信:在每一个碎片类中,都可以通过getActivity()方法获取与之相关联的活动类,如下代码:MainActivity mainActivity=(MainActivity)getActivity();而在活动类中入MainActivity ,FragmentManager提供了findFragmentById,可以在活动中获取相应的碎片类, 如下代码:LeftFragment leftFragment=(LeftFragment) getFragmentManager.findFragmentById(R.id.left_fragment);在碎片中能获取活动后,可以通过活动去获取碎片,这样就可以达成不同碎片间的通信。


关于碎片的生命周期,因为篇幅过长,将会在下一篇幅 《碎片的生命周期》 进行详细描述。

原创粉丝点击