浅谈Fragment

浅谈Fragment

fragment是可以放置在活动中的一个应用程序的用户界面或行为。

生命周期

fragment的生命周期与受所处的activity的生命周期控制,同时它也拥有自己的生命的周期,包括基本的生命周期以及与用户进行交互的生命周期。以下为使fragment恢复恢复状态(与用户进行交互)的核心系列生命周期方法:

1、onAttach:一旦该fragment与其活动相关联,就会调用
2、onCreate:对fragment进行初始化
3、onCreateView:创建并返回与fragment相关联的视图层次结构.
4、onActivityCreated:告诉fragment其activity已经完成了自己的Activity.onCreate().
5、onViewStateRestored:告诉fragment其视图层次结构的所有保存状态已被还原.
6、onStart:使该fragment对用户可见.
7、onResume:使fragment开始与用户进行交互.

fragment的实现

可以通过两种方式向 activity 添加fragment:

1、在 Activity 的xml文件中添加,将fragment作为view来定义

<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:name="com.example.Fragment" android:id="@+id/list" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" />
</LinearLayout>

2、通过代码将fragment添加到某个ViewGroup
主要是通过FragmentManager来获取实例

FragmentManager fragmag = getFragmentManager();
FragmentTransaction fragtrans = fragmag.beginTransaction();
ExampleFragment fragment = new ExampleFragment();
fragtrans.add(R.id.fragment, fragment);
fragtrans.commit();

FragmentManager可以对fragment进行管理:

findFragmentById():通过fragment的id获取fragment
popBackStack():将fragment从返回栈中弹出
addOnBackStackChangedListener():注册一个侦听返回栈变化的侦听器

FragmentTransaction用于执行fragment的事务,根据用户行为实现添加、移除、替换以及其他操作,一旦通过FragmentTransaction做出了更改,就必须调用commit()使更改生效。

一个简单的实例

主要代码:

MainActivity.java

public class MainActivity extends Activity implements OnClickListener {

    private Button one,two,three;
    private FragmentManager fm;
    private FragmentTransaction ft;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init() {
        one = (Button)this.findViewById(R.id.one);
        two = (Button)this.findViewById(R.id.two);
        three = (Button) this.findViewById(R.id.three);
        one.setOnClickListener(this);
        two.setOnClickListener(this);
        three.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        fm = getFragmentManager();
        ft = fm.beginTransaction();
        if(v == one){
            Intent intent = new Intent(MainActivity.this, oneFragment.class);
            startActivity(intent);
        }else if(v == two){
            ft.replace(R.id.fragment_content,new twoFragment());
        }else if(v == three){
            ft.add(R.id.fragment_content,new threeFragment());
        }
        ft.commit();
    }
}

按钮“one”实现跳转到另一个activity,按钮“two”主要用Transaction的replace方法添加fragment,按钮“three”主要用Transaction的add方法添加fragment。
replace方法会更新fragment,而add方法在原有的fragment上添加了新的fragment。
可看一下两图的效果:

这是在点击按钮two后再点击按钮three的效果,两个fragment重叠在一起

这是在点击按钮three后再点击按钮two的效果,此时只显示fragmenttwo

按钮“one”跳转实现的oneFragment是显示花的品种及其相应的信息,主要代码如下:

public class oneFragment extends Activity implements oneListFragment.Callbacks{
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.one_main);
    }

    // 实现Callbacks接口必须实现的方法
    @Override
    public void onItemSelected(Integer id)
    {
        Bundle arguments = new Bundle();
        arguments.putInt(DesFragment.ITEM_ID, id);
        DesFragment fragment = new DesFragment();
        fragment.setArguments(arguments);
        getFragmentManager().beginTransaction()
                .replace(R.id.fragment_content, fragment)
                .commit();
    }
}

oneListFragment主要用于显示fragment,以及处理fragment,以实现点击相应的花品种显示相应的信息在fraglayout中,效果如下图所示:

oneListFragment.java

public class oneListFragment extends ListFragment {
    private Callbacks mCallbacks;
    // 定义一个回调接口,该Fragment所在Activity必须实现该接口
    public interface Callbacks {
        public void onItemSelected(Integer id);
    }
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        //用adapter填充fragment
        setListAdapter(new ArrayAdapter<Connect.Flower>(getActivity(),
                android.R.layout.simple_list_item_activated_1,
                android.R.id.text1, Connect.ITEMS));
    }
    // 当该Fragment被添加时,回调该方法
    @Override
    public void onAttach(Activity activity)
    {
        super.onAttach(activity);
        if (!(activity instanceof Callbacks))
        {
            throw new IllegalStateException(
                    "error");
        }
        mCallbacks = (Callbacks)activity;
    }
    // 当该Fragment被删除时,回调该方法
    @Override
    public void onDetach()
    {
        super.onDetach();
        mCallbacks = null;
    }
    // 当用户单击某列表项时激发该方法
    @Override
    public void onListItemClick(ListView listView
            , View view, int position, long id)
    {
        super.onListItemClick(listView, view, position, id);
        // 激发mCallbacks的onItemSelected方法
        mCallbacks.onItemSelected(Connect
                .ITEMS.get(position).id);
    }
}

作者:魏超凡:原文地址

你可能感兴趣的:(浅谈Fragment)