Android学习--《Fragment》

概要:

fragment可以看作是一个子acitity,它具有自己的生命周期,与输入事件

可以在不同的activity里复用,是activity模块化的一部分 可重用,模块化的UI组件

创建:

必须重写的回调方法 onCreateView(), 用来定义布局

示例:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.ViewGroup;

public class ArticleFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.article_view, container, false);
    }
}

添加

添加fragment到一个activity中有两种方法,一种是静态添加的,一种是动态的

静态添加

就是通过xml文件添加到布局中,但是这样无法对fragment进行操作

动态添加

FragmentManager 类在 Activity 运行时 对 Fragment 进行添加,移除,替换

FragmentManager => (beginTransation()) 创建一个FargmentTransation => (add()) 添加一个Fragment

Tips:

  • 我们需要设置一个空的View作为fragment的容器,如下:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" />
  • 我们通过FragmentTransation进行多级事务后,要 通过 commits() 提交

//以下代码要写在 A次vity 的 onCreated() 方法里

// Create a new Fragment to be placed in the activity layout
            HeadlinesFragment firstFragment = new HeadlinesFragment();

            // In case this activity was started with special instructions from an
            // Intent, pass the Intent's extras to the fragment as arguments
            firstFragment.setArguments(getIntent().getExtras());

            // Add the fragment to the 'fragment_container' FrameLayout
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, firstFragment).commit(); //最后commit()
  • replace()只要将add()替换就可以完成了。

  • 注意:移除和替换后,我们要让用户可以向前撤销这次操作,那么在commit前,就必须调用 addToBackStack() 方法

Fragment之间的交互

Fragment之间是不应该交互的,但是可以通过宿主activity来进行间接的交互

那么Fragment和activity之间如何交互呢?

第一种情况:Fragment到Activity

大概流程:

  1. 在fragment里定义一个接口 A
  2. 在acivity中实现这个接口,(implent A)
  3. 在fragment的onAttach()方法中获取接口的方法,然后调用接口方法来和activity交互

这个过程还是看代码回更加清晰一些:

//在fragment中定义接口

public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;

    // Container Activity must implement this interface
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }

    ...
}

之后fragment中任何地方都可以使用 mCallback.onArticleSelected(position)来调用activity中实现的此方法

当然activity中怎么实现就随意了

你可能感兴趣的:(android)