Fragment和Activity通信中体现的接口回调

有一个很经典的例子说的是,小王有个数学问题要问小李,小李一时没做出来,对小王说,我先记着等我知道答案了再打电话告诉你。

在这个例子中首先小王向小李问问题,这个时候小王要把自己这个对象发给小李,这样小李在回拨电话的时候才不会不知道要打给谁。其次是小王要有小李这个对象的引用,这样才知道打给谁。第三,有一个接口,通过这个接口小李可以把答案发给小王,因此小王必须继承这个接口。

这个经典的例子在我接口回调学习初期很难深入到可以理解真正的安卓代码应用,昨天我就遇到这么一个问题,苦苦思索一晚上,有了点头绪但不一定是对的,今天和大家一起讨论下。

在我的例子(网上经典例子)中有leftFragment 和 rightFragment两个Fragment;先将两个Fragment加入到MainActivity中;从leftFragment中做出的动作显示在rightFragment中。

先看leftFragment的代码:

package com.example.fragmentactivity;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;

public class LeftFragment extends Fragment implements OnClickListener {
	
	//Activity继承并实现这个接口即可实现资源的共享了
	public interface MyListener{
		public void showMessage(int x);
	}
	MyListener mylistener;
	Button firstButton;
	Button secondButton;
	Button thirdButton;
//根据Fragment的生命周期,当Activity添加这个Fragment时候第一个调用的方法。通过此方法,Fragment获得了所在Activity的引用,
//作用类似上述例子中的小李获得了小王的引用
	@Override
	public void onAttach(Activity activity) {
		// TODO Auto-generated method stub
		mylistener=(MyListener) activity;
		super.onAttach(activity);
	}
	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
	}
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		View view = inflater.inflate(R.layout.leftfragment,null);
		return view;
		}
	@Override
	public void onResume() {
		firstButton = (Button) getView().findViewById(R.id.first_button);
		secondButton=(Button) getView().findViewById(R.id.second_button);
		thirdButton=(Button) getView().findViewById(R.id.third_button);
		firstButton.setOnClickListener(this);
		secondButton.setOnClickListener(this);
		thirdButton.setOnClickListener(this);
		
		
		// TODO Auto-generated method stub
		super.onResume();
	}
	@Override
	public void onClick(View v) {
		Button button=(Button) v;
		switch( button.getId()){ 
		case R.id.first_button:
//通过mylistener调用Activity具体实现这个方法。相当于小李回调小王,告诉小王答案。
			mylistener.showMessage(1);
			break;
		case R.id.second_button:
			mylistener.showMessage(2);
			break;
		case R.id.third_button:
			mylistener.showMessage(3);
			break;
		}
	
	}
	
接下来的是MainActivity

package com.example.fragmentactivity;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.widget.TextView;

import com.example.fragmentactivity.LeftFragment.MyListener;

public class MainActivity extends Activity  implements MyListener{    //这里集成了具有回调函数的接口,小王的特征1
	
	TextView showMessageView;
	//这里是对接口函数的具体实现
	@Override //
	public void showMessage(int x) {
		showMessageView.setText("hello world");
				}
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		FragmentManager fr= getFragmentManager();
		 FragmentTransaction tr=fr.beginTransaction();
		 //实例化两个Fragment
		 LeftFragment leftFragement = new LeftFragment();
		 RightFragment rightFragment = new RightFragment();
//这里的add函数将出发Fragment的onAttach函数,把当前引用的发送出去,相当于小王把自己的电话留给小李,小李知道答案后可以会拨给小王。
		tr.add(R.id.left_layout,leftFragement);
		tr.add(R.id.right_layout,rightFragment);
		tr.commit();
	}
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		showMessageView=(TextView) findViewById(R.id.right_show_message);
		super.onResume();
	}

}

总之这里的接口回调概念就体现的很彻底了,在本例中Activity让LeftFragment接受按钮出发,LeftFragment把接收到的信息回调给Activity。

总之我们看出这里面最主要的方法时tr.add这个方法,这个方法导致了哪些操作呢?下图说明了这一过程,具体涉及到Fragment和Activity的生命周期,这里就不具体讲了。

Fragment和Activity通信中体现的接口回调_第1张图片

相关源代码免费下载:http://download.csdn.net/detail/shenlei190810/7720839


你可能感兴趣的:(安卓与java)