在看Android帮助文档的时候,会出现一些例子,但是例子总是穿插着多种知识,让还没有系统学过Android的人读起来很费神难懂,所以就自己写了一个creating event callbacks to activity的例子.
LeftFragment的布局layout:leftfragment.xml
RightFragment的布局layout:
rightfragment.xml
以上是两个fragment和一个Activity的布局文件,下面来看他们的java文件
LeftFragment:
RightFragment:
注意,Fragment的生命周期和Activity生命周期之间的关系。在Activity里动态生成Fragment,首先是Activity调用onCreate()方法,但是这时候还没有加载到Fragment里的组件,当Fragment调用其onCreateView()方法后,Activity才能得到Fragment中的组件.以下可以看到它们的生命周期情况:
我把Activity的UI分为两个部分,左边和右边,左边用来放置点击的按钮(LeftFragment),右边用来放置对应点击后显示的信息(RightFragment).
Activity的布局layout文件:main.xml
- <?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>
- <?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>
- <?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>
Activity:
- 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);
- }
- }
- 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);
- }
- }
- }
- 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去实现它。当Fragment调用onAttach(Activity acitivity)方法的