您的位置:首页 > 移动开发 > Android开发

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

2014-11-04 10:31 691 查看
摘要 首先,如果你想在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进行交互了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐