android中fragment与activity之间通信原理以及例子

摘要 首先,如果你想在android3.0及以下版本使用fragment,你必须引用android-support-v4.jar这个包 然后你写的activity不能再继承自Activity类了,而是要继承android.support.v4.app.FragmentActivity,一些其他的父类也有相应的变化. 由于在android的实现机制中frag

首先,如果你想在android3.0及以下版本使用fragment,你必须引用android-support-v4.jar这个包

然后你写的activity不能再继承自Activity类了,而是要继承android.support.v4.app.FragmentActivity,一些其他的父类也有相应的变化.


由于在android的实现机制中fragment和activity会被分别实例化为两个不相干的对象,他们之间的联系由activity的一个成员对象fragmentmanager来维护.fragment实例化后会到activity中的fragmentmanager去注册一下,这个动作封装在fragment对象的onAttach中,所以你可以在fragment中声明一些回调接口,当fragment调用onAttach时,将这些回调接口实例化,这样fragment就能调用各个activity的成员函数了,当然activity必须implements这些接口,否则会包classcasterror

fragment和activity的回调机制又是OOP的一次完美演绎!

下面通过一个例子来说明:

 

我把Activity的UI分为两个部分,左边和右边,左边用来放置点击的按钮(LeftFragment),右边用来放置对应点击后显示的信息(RightFragment).

Activity的布局layout文件:main.xml

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version= "1.0"  encoding= "utf-8" ?>
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
     android:layout_width= "fill_parent"
     android:layout_height= "fill_parent"
     android:orientation= "horizontal"  >
   
     <LinearLayout
         android:id= "@+id/left_layout"
         android:layout_width= "wrap_content"
         android:layout_height= "fill_parent"
         android:layout_weight= "1"
         android:orientation= "vertical"  >
     </LinearLayout>
   
     <LinearLayout
         android:id= "@+id/right_layout"
         android:layout_width= "wrap_content"
         android:layout_height= "fill_parent"
         android:layout_weight= "10"
         android:orientation= "vertical"  >
     </LinearLayout>
   
</LinearLayout>

LeftFragment的布局layout:leftfragment.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version= "1.0"  encoding= "utf-8" ?>
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
     android:layout_width= "match_parent"
     android:layout_height= "match_parent"
     android:orientation= "vertical"  >
   
     <Button
         android:id= "@+id/first_button"
         android:layout_width= "fill_parent"
         android:layout_height= "wrap_content"
         android:text= "@string/first_button"  />
   
     <Button
         android:id= "@+id/second_button"
         android:layout_width= "fill_parent"
         android:layout_height= "wrap_content"
         android:text= "@string/second_button"  />
   
     <Button
         android:id= "@+id/third_button"
         android:layout_width= "fill_parent"
         android:layout_height= "wrap_content"
         android:text= "@string/third_button"  />
   
</LinearLayout>

RightFragment的布局layout:rightfragment.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version= "1.0"  encoding= "utf-8" ?>
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
     android:layout_width= "match_parent"
     android:layout_height= "match_parent"
     android:orientation= "vertical"  >
   
     <TextView
         android:id= "@+id/right_show_message"
         android:layout_width= "fill_parent"
         android:layout_height= "fill_parent"
         android:background= "@android:color/holo_orange_dark"
         android:textColor= "@android:color/white"  />
   
</LinearLayout>

以上是两个fragment和一个Activity的布局文件,下面来看他们的java文件

Activity:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class FirstActivity extends Activity implements MyListener
{
     /**
      * 实现MyListener,当LeftFragment中点击第一页的时候,让RightFragment显示第一页信息,同理当点击第二页的时候,RightFragment显示第二页信息
     
      * @param index
      *            显示的页数
      */
     public void showMessage(int index)
     {
         if  (1 == index)
             showMessageView.setText(R.string.first_page);
         if  (2 == index)
             showMessageView.setText(R.string.second_page);
         if  (3 == index)
             showMessageView.setText(R.string.third_page);
     }
   
     /** 得到RightFragment中显示信息的控件 */
     private TextView showMessageView;
   
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.main);
         System.out.println( "Activity--->onCreate" );
   
         FragmentManager manager = getFragmentManager();
         FragmentTransaction transaction = manager.beginTransaction();
         // 动态增加Fragment
         RightFragment rightFragment =  new  RightFragment();
         LeftFragment leftFragment =  new  LeftFragment();
         transaction.add(R.id.left_layout, leftFragment,  "leftfragment" );
         transaction.add(R.id.right_layout, rightFragment,  "rightfragment" );
         transaction.commit();
   
     }
   
     @Override
     protected void onResume()
     {
         super .onResume();
         System.out.println( "Activity--->onResume" );
         showMessageView = (TextView) findViewById(R.id.right_show_message);
     }
}

LeftFragment:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public class LeftFragment extends Fragment
{
     /** Acitivity要实现这个接口,这样Fragment和Activity就可以共享事件触发的资源了 */
     public interface MyListener
     {
         public void showMessage(int index);
     }
   
     private MyListener myListener;
     private Button firstButton;
     private Button secondButton;
     private Button thirdButton;
   
     /** Fragment第一次附属于Activity时调用,在onCreate之前调用 */
     @Override
     public void onAttach(Activity activity)
     {
         super .onAttach(activity);
         System.out.println( "LeftFragment--->onAttach" );
   
         myListener = (MyListener) activity;
     }
   
     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super .onCreate(savedInstanceState);
         System.out.println( "LeftFragment--->onCreate" );
     }
   
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
     {
         System.out.println( "LeftFragment--->onCreateView" );
         return  inflater.inflate(R.layout.leftfragment, container,  false );
     }
   
     @Override
     public void onResume()
     {
         super .onResume();
         System.out.println( "LeftFragment--->onResume" );
   
         firstButton = (Button) getActivity().findViewById(R.id.first_button);
         secondButton = (Button) getActivity().findViewById(R.id.second_button);
         thirdButton = (Button) getActivity().findViewById(R.id.third_button);
   
         MyButtonClickListener clickListener =  new  MyButtonClickListener();
         firstButton.setOnClickListener(clickListener);
         secondButton.setOnClickListener(clickListener);
         thirdButton.setOnClickListener(clickListener);
     }
   
     /** 按钮的监听器 */
     class MyButtonClickListener implements OnClickListener
     {
         public void onClick(View v)
         {
             Button button = (Button) v;
             if  (button == firstButton)
                 myListener.showMessage(1);
             if  (button == secondButton)
                 myListener.showMessage(2);
             if  (button == thirdButton)
                 myListener.showMessage(3);
         }
     }
}

RightFragment:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class RightFragment extends Fragment
{
     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         System.out.println( "RightFragment--->onCreate" );
         super .onCreate(savedInstanceState);
     }
   
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
     {
         System.out.println( "RightFragment--->onCreateView" );
         return  inflater.inflate(R.layout.rightfragment, container,  false );
     }
}

注意,Fragment的生命周期和Activity生命周期之间的关系。在Activity里动态生成Fragment,首先是Activity调用onCreate()方法,但是这时候还没有加载到Fragment里的组件,当Fragment调用其onCreateView()方法后,Activity才能得到Fragment中的组件

 

 

 

这里最关键的就是Fragment要有一个接口和这个接口的引用,而这个接口需要Activity去实现它。当Fragment调用onAttach(Activity acitivity)方法的时候,将这个activity传递给这个接口引用,这样,就可以和Activity进行交互了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值