activity与fragment通信汇总

先看效果:蓝色区域为activity,红色为leftfragment,绿色为rightfragment。

1,activity向fragment传递消息:

 在activity中:

		Bundle bundle=new Bundle();
				bundle.putString("msg", "收到activity发送来的消息");
				rightfragment.setArguments(bundle);

也就是通过fragment的setArgument()方法传递一个Bundle类型的数据

在fragment中:

//接收来自activity的消息并显示
    		    tvFromactivity=(TextView) getActivity().findViewById(R.id.tv_fromactivity);
					Bundle bundle=getArguments();
		    		String str=bundle.getString("msg");
		    		tvFromactivity.setText(str);

通过getArgument()方法获取activity传递过来的数据。

注意的是这种传递方式好像类似于Intent,只有在fragment还未显示也就是创建fragment的时候才可以用这种方式传递。

2,fragment向activity传递消息:

leftfragment中:

    ..........
//leftfragment通知activity的回调接口
public interface Mylistener{
		public void showMessage(int index);
	}
	
	private Mylistener mlistener;

        .......

              btFirst=(Button) getActivity().findViewById(R.id.bt_first);
        btSecond=(Button) getActivity().findViewById(R.id.bt_second);
        btThird=(Button) getActivity().findViewById(R.id.bt_fourth);
        btsendtoright=(Button) getActivity().findViewById(R.id.bt_sendtoright);
        
        MybuttonClickListener listener=new MybuttonClickListener();
        btFirst.setOnClickListener(listener);
        btSecond.setOnClickListener(listener);
        btThird.setOnClickListener(listener);
           .......
             class MybuttonClickListener implements OnClickListener{

        @Override
        public void onClick(View v) {
            Button button=(Button) v;
            if(button==btFirst){
                //调用回调接口的方法
                mlistener.showMessage(1);
            }
            if(button==btSecond){
                mlistener.showMessage(2);
            }
            if(button==btThird){
                mlistener.showMessage(3);
            }
        }
         
     }
activity中:

在activity中实现接口响应回调方法

//实现接口响应回调方法
	@Override
	public void showMessage(int index) {
		if(index==1){
			tvMessage.setText("这是第一页 这是第一页 这是第一页 这是第一页");
		}
		if(index==2){
			tvMessage.setText("这是第二页 这是第二页 这是第二页 这是第二页");
		}
		if(index==3){
			tvMessage.setText("这是第三页 这是第三页 这是第三页 这是第三页");
		}
	}

3,fragment向fragment传递消息:

fragment向fragment传递消息只能通过activity间接传递,也就是leftfragment先把消息传递给activity,然后再有activity传递给rightfragment

activity中:

 //leftfragment通知rightfragment的回调接口
   public interface Mycallback{
	   public void callback(String str);
   }
.....
             LeftFragment leftfragment=new LeftFragment();
        final RightFragment rightfragment=new RightFragment();
        transaction.add(R.id.left_layout, leftfragment, "leftfragment");
        transaction.add(R.id.right_layout, rightfragment,"rightfragment");
        //transaction.commit();
        //往leftfragment中设置回调接口,便于从leftfragment得到传递给activity的消息
        leftfragment.setcallback(new Mycallback() {
            @Override
            public void callback(String str) {
                //把从leftfragment得到的消息传递给rightfragment让其显示
                rightfragment.showfromleft(str);
            }
        });
leftfragment中:

        ......
       Mycallback mcallback=null;
	
	public void setcallback(Mycallback call){
		mcallback=call;
	}
        .....
       btsendtoright.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mcallback.callback("接收到来自leftfragment的消息");
            }
        });

rightfragment中:

   public void showfromleft(String str){
    	  tvFromactivity.setText(str);
      }
      

最后附上完整代码:

package com.app.activityandfragment;

import com.app.activityandfragment.MainActivity.Mycallback;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
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{
	//leftfragment通知activity的回调接口
	public interface Mylistener{
		public void showMessage(int index);
	}
	
	private Mylistener mlistener;
	private Button btFirst,btSecond,btThird,btsendtoright;
	
	
	Mycallback mcallback=null;
	
	public void setcallback(Mycallback call){
		mcallback=call;
	}
	@Override
	public void onAttach(Context context) {
		super.onAttach(context);
		mlistener=(Mylistener) context;
	}
     @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
    	return inflater.inflate(R.layout.leftfragment,container, false);
    }
     
     @Override
    public void onActivityCreated(Bundle savedInstanceState) {
    	// TODO Auto-generated method stub
    	super.onActivityCreated(savedInstanceState);
    }
     
     @Override
    public void onStart() {
    	// TODO Auto-generated method stub
    	super.onStart();
    }
     
     @Override
    public void onResume() {
    	super.onResume();
    	btFirst=(Button) getActivity().findViewById(R.id.bt_first);
    	btSecond=(Button) getActivity().findViewById(R.id.bt_second);
    	btThird=(Button) getActivity().findViewById(R.id.bt_fourth);
    	btsendtoright=(Button) getActivity().findViewById(R.id.bt_sendtoright);
    	
    	MybuttonClickListener listener=new MybuttonClickListener();
    	btFirst.setOnClickListener(listener);
    	btSecond.setOnClickListener(listener);
    	btThird.setOnClickListener(listener);
    	
    	btsendtoright.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				mcallback.callback("接收到来自leftfragment的消息");
			}
		});
    }
     
     class MybuttonClickListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			Button button=(Button) v;
			if(button==btFirst){
				//调用回调接口的方法
				mlistener.showMessage(1);
			}
			if(button==btSecond){
				mlistener.showMessage(2);
			}
			if(button==btThird){
				mlistener.showMessage(3);
			}
		}
    	 
     }
}

</pre><pre name="code" class="html">package com.app.activityandfragment;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

public class RightFragment extends Fragment{
	
	private TextView tvFromactivity;
   @Override
public void onAttach(Context context) {
	// TODO Auto-generated method stub
	super.onAttach(context);
}
     @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=View.inflate(getActivity(), R.layout.rightfragment, null);
    		return inflater.inflate(R.layout.rightfragment,container,false);
    	 // tvFromactivity=(TextView) view.findViewById(R.id.tv_fromactivity); 
    	 // return view;
    	}
     
     
      public void showfromleft(String str){
    	  tvFromactivity.setText(str);
      }
      
     @Override
    	public void onActivityCreated(Bundle savedInstanceState) {
    		// TODO Auto-generated method stub
    		super.onActivityCreated(savedInstanceState);
    	}
     
     @Override
    	public void onStart() {
    		// TODO Auto-generated method stub
    		super.onStart();
    	}
     
     @Override
    	public void onResume() {
    		// TODO Auto-generated method stub
    		super.onResume();
    		//接收来自activity的消息并显示
    		    tvFromactivity=(TextView) getActivity().findViewById(R.id.tv_fromactivity);
					Bundle bundle=getArguments();
		    		String str=bundle.getString("msg");
		    		tvFromactivity.setText(str);
    	}
}

package com.app.activityandfragment;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

import com.app.activityandfragment.LeftFragment.Mylistener;

public class MainActivity extends FragmentActivity implements Mylistener{
   private TextView tvMessage,tvFromfragment;
   private Button btSendTofragment;
   
   //leftfragment通知rightfragment的回调接口
   public interface Mycallback{
	   public void callback(String str);
   }
   
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		btSendTofragment=(Button) findViewById(R.id.bt_sendtofragment);
		tvFromfragment=(TextView) findViewById(R.id.tv_fromfragment);
		tvMessage=(TextView) findViewById(R.id.tv_fromfragment);
		
		FragmentManager manager=getSupportFragmentManager();
		final FragmentTransaction transaction=manager.beginTransaction();
		
		 LeftFragment leftfragment=new LeftFragment();
		final RightFragment rightfragment=new RightFragment();
		transaction.add(R.id.left_layout, leftfragment, "leftfragment");
		transaction.add(R.id.right_layout, rightfragment,"rightfragment");
		//transaction.commit();
		//往leftfragment中设置回调接口,便于从leftfragment得到传递给activity的消息
		leftfragment.setcallback(new Mycallback() {
			@Override
			public void callback(String str) {
				//把从leftfragment得到的消息传递给rightfragment让其显示
				rightfragment.showfromleft(str);
			}
		});
		
		
		btSendTofragment.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Bundle bundle=new Bundle();
				bundle.putString("msg", "收到activity发送来的消息");
				rightfragment.setArguments(bundle);
				transaction.commit();
			}
		});
	}
  
	//实现接口响应回调方法
	@Override
	public void showMessage(int index) {
		if(index==1){
			tvMessage.setText("这是第一页 这是第一页 这是第一页 这是第一页");
		}
		if(index==2){
			tvMessage.setText("这是第二页 这是第二页 这是第二页 这是第二页");
		}
		if(index==3){
			tvMessage.setText("这是第三页 这是第三页 这是第三页 这是第三页");
		}
	}
   
	@Override
		protected void onResume() {
			super.onResume();
			//tvMessage=(TextView) findViewById(R.id.textView1);
		}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值