浅谈Fragment

来源:互联网 发布:ubunte怎么编程 编辑:程序博客网 时间:2024/05/17 04:13

浅谈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);    }}

作者:魏超凡:原文地址