fragment 与activity通信 Bundle 序列化数据 Serializable - 赵子隆

时间:2024-01-31 10:34:56

fragment 与activity通信 Bundle 序列化数据 Serializable

1、fragment简单套用(静态调用):

新建一个fragment,其xml文件如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:background="#00ff00" >  
  
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="This is fragment 1"  
        android:textColor="#000000"  
        android:textSize="25sp" />  
  
</LinearLayout>  

其java文件如下:

 public class Fragment1 extends Fragment {  
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
        return inflater.inflate(R.layout.fragment1, container, false);  
    }  
} 

在主Activity的布局中加入:

    <fragment  
        android:id="@+id/fragment1"  
        android:name="com.example.fragmentdemo.Fragment1"  
        android:layout_width="0dip"  
        android:layout_height="match_parent"  
        android:layout_weight="1" /> 

这样就可以了;

2、动态使用fragment

首先,Activity的布局中不用加fragment:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:id="@+id/main_layout"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:baselineAligned="false" >  
  
</LinearLayout>  

在java中:

Fragment1 fragment1 = new Fragment1();  
            getFragmentManager().beginTransaction().replace(R.id.main_layout, fragment1).commit(); 

分四步:

1.获取到FragmentManager,在Activity中可以直接通过getFragmentManager得到。

2.开启一个事务,通过调用beginTransaction方法开启。

3.向容器内加入Fragment,一般使用replace方法实现,需要传入容器的id和Fragment的实例。

4.提交事务,调用commit方法提交。

 

若是想在Fragment中调用Activity中的函数,可直接使用(MainActivity)getActivity()来获取活动;

 

若想在创建Fragment时,从Activity中传递数据给Fragment,可利用Bundle:

        FriendsFragment friendsFragment = new FriendsFragment();
        Bundle bundle = new Bundle();
        serializable = new DataSerializable();
        serializable.setListFriend(myFriendList);
        bundle.putSerializable("list_friend", serializable);
        friendsFragment.setArguments(bundle);
        fragmentList.add(friendsFragment);

Fragment代码中:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_friends, container, false);

        DataSerializable dataSerializable = (DataSerializable)getArguments().getSerializable("list_friend");
        List<MyFriend> myFriendsList = dataSerializable.getListFriend();

        return view;
    }

其中,DataSerializable是自己实现的一个类,实现了Serializable接口,这样就可以在Bundle中存储更多复杂类型的数据,简单数据比如int,直接用Bundle.putint();

DataSerializable代码如下:

public class DataSerializable implements Serializable {
    private List<MyFriend> myFriendList;

    public void setListFriend(List<MyFriend> myFriendList){
        this.myFriendList = myFriendList;
    }
    public List<MyFriend> getListFriend(){
        return myFriendList;
    }
}

 

如果在Activity中想调用Fragment中的函数:

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);