Fragment之Creating event callbacks to activity实例

原创 2012年03月23日 22:10:07

在看Android帮助文档的时候,会出现一些例子,但是例子总是穿插着多种知识,让还没有系统学过Android的人读起来很费神难懂,所以就自己写了一个creating event callbacks to activity的例子.

我把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>
LeftFragment的布局layout:leftfragment.xml

<?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

<?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: 

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:

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:

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进行交互了.

Fragment与Activity之间通信实例

  • 2014年08月06日 13:04
  • 1.6MB
  • 下载

llegalStateException: Fragment XXXFragment not attached to Activity异常处理

下边两个问题,是在开发中碰到的一些关于Fragment的偶发性的问题,今天时间比较多,就在网上搜了一些解决方式: 1、关于Fragment(XXFragment) not attached to...

Fragment和Activity通信的实例

  • 2015年09月13日 11:02
  • 1.88MB
  • 下载

Fragment FragmentOne{2627db19} not attached to Activity

这里的异常是有Fragment中使用getString()所导致的,因为getResource()无法获取到 下面看log及解决方法 01-07 00:54:53.513: E/And...

Fragment " + this + " not attached to Activity 异常解决

问题出现:当我们启动一个新的页面(Fragment),一个网络耗时操作,操作完成调用Fragment 的getString()方法更新UI,但是如果网络耗时还有完成,我们立马关闭页面,此时就会报上面这...

java.lang.IllegalStateException: Fragment(XXFragment) not attached to Activity异常。

转载自 http://blog.csdn.net/winson_jason/article/details/20357435 下边两个问题,是在开发中碰到的一些关于Fragment的偶发性的...

Activity跳转到指定Fragment实例

最近做的一个项目,突然出现了这个问题, Activity 中有四个fragment,分别是 first, two, three, four,默认显示的是fragment a。在开发过程中,fi...

activity+fragment 浅显实例的实现

1.xml activity_main.xml xmlns:tools="http://schemas.android.com/tools" android:id="@+id/c...
  • Xurns
  • Xurns
  • 2016年06月06日 09:13
  • 317
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Fragment之Creating event callbacks to activity实例
举报原因:
原因补充:

(最多只允许输入30个字)