【Android基础知识】Fragment和Activity通信

FragmentActivity如何互相获取对象

1.Fragment可调用getActivity()方法获取它所在的Activity

2.Activity可调用FragmentManagerfindFragmentById()findFragmentByTag()方法获取Fragment

FragmentActivity互相传递数据

Activity -> Fragment :在Activity中创建Bundle数据包,并调用FragmentsetArgumentsBundle bundle)方法。

1.实现一个Activity,布局和代码文件如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/frame" >
    <EditText 
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/send"
        android:text="发送到Fragment"/>
    
</LinearLayout>
MainActivity.java

public class MainActivity extends Activity {
	private EditText mEditText ;
	private Button mButton;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mEditText = (EditText)findViewById(R.id.editText);
		mButton = (Button)findViewById(R.id.send);
		mButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				String str = mEditText.getText().toString();
				MyFragemnt fragemnt = new MyFragemnt();
				Bundle bundle = new Bundle();
				bundle.putString("text",str);
				//使用setArguments(bundle)方法向fragment发送数据
				fragemnt.setArguments(bundle);
				FragmentManager manager = getFragmentManager();
				FragmentTransaction transaction = manager.beginTransaction();
				transaction.add(R.id.frame, fragemnt,"fragment");
				transaction.commit();
				Toast.makeText(MainActivity.this, "向fragment发送数据",
						Toast.LENGTH_SHORT).show();
			}
		});
	}
}

2.实现一个Fragment,布局为一个TextView,代码如下:

public class MyFragemnt extends Fragment{

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.fragment, container,false);
		TextView textView  = (TextView)view.findViewById(R.id.text);
		//接收Activity发送过来的数据
		String text = getArguments().get("text").toString();
		textView.setText(text);
		Toast.makeText(getActivity(), "接收到数据"+text,
				Toast.LENGTH_SHORT).show();
		return view;
	}
}


Fragment -> Activity :需要在Fragment中定义一个内部回调接口,让包含该FragmentActivity实现该回调接口。这样Fragment可调用回调方法将数据传递给Activity

1.在MyFragment中定义接口并调用接口的方法向Activity传递数据

MyFragment.java

public class MyFragemnt extends Fragment{

	private String codeString = "Thank you ,Activity!";
	public MyListener listener;
	//定义一个内部的接口,向Fragm传值
	public interface MyListener{
		public void Thanks(String str);
	}
	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		//确保Activity实现了这个接口,初始化listener对象
		if(activity instanceof MyListener){
			listener = (MyListener) activity;
		}
	}
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.fragment, container,false);
		TextView textView  = (TextView)view.findViewById(R.id.text);
		//接收Activity发送过来的数据
		String text = getArguments().get("text").toString();
		textView.setText(text);
		Toast.makeText(getActivity(), "接收到数据"+text,
				Toast.LENGTH_SHORT).show();
		if(listener != null){
			listener.Thanks(codeString);
		}
		return view;
	}
}
2.Activity实现MyListenr接口并打印接收到的数据

public class MainActivity extends Activity implements MyListener{
	private EditText mEditText ;
	private Button mButton;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mEditText = (EditText)findViewById(R.id.editText);
		mButton = (Button)findViewById(R.id.send);
		mButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				String str = mEditText.getText().toString();
				MyFragemnt fragemnt = new MyFragemnt();
				Bundle bundle = new Bundle();
				bundle.putString("text",str);
				//使用setArguments(bundle)方法向fragment发送数据
				fragemnt.setArguments(bundle);
				FragmentManager manager = getFragmentManager();
				FragmentTransaction transaction = manager.beginTransaction();
				transaction.add(R.id.frame, fragemnt,"fragment");
				transaction.commit();
				Toast.makeText(MainActivity.this, "向fragment发送数据",
						Toast.LENGTH_SHORT).show();
			}
		});
		/*
		 * 静态Fragment传值
		 
		FragmentManager manager = getFragmentManager();
		Fragment fragment = manager.findFragmentById(R.id.fragment);
		MyFragemnt myFragemnt = (MyFragemnt)fragment;
		//使用myFragment传值
*/	}
	/**
	 * 实现Fragment中定义的接口,接收fragment传递过来的值
	 */
	@Override
	public void Thanks(String str) {
		Toast.makeText(MainActivity.this, "已接收到Fragment数据" + str,
				Toast.LENGTH_SHORT).show();
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值