android fragment(2)

fragment之间传值

1.从activity传值给fragment或者从fragment传值给fragment

(1)构造函数中传值或者通过set方法传值

new AFragment("data");

注意fragment一定要有一个无参数的构造函数,因为在恢复fragment的时候会走无参数的构造函数

所以通过此种方式传值会有一个缺点,当恢复fragment的时候,没有带上数据参数。

(2)使用setArgument方法来传值

BaseFragment af = new AFragment();
		Bundle bundle = new Bundle();
		bundle.putString("arg", "skip a");
		af.setArguments(bundle);

2.从当前fragment回传值给上一个fragment或者activity

使用回调方式,使用一个基类方便管理

protected FragmentListener mFragmentListener;

	public String TAG = BaseFragment.this.getClass().getSimpleName();

	public void setFragmentListener(FragmentListener l) {
		mFragmentListener = l;
	}

public interface FragmentListener {

	}


使用示例

BaseFragment:定义回调接口,管理返回方法(onBackPressed)

package com.example.fragment;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class BaseFragment extends Fragment {

	protected FragmentListener mFragmentListener;

	public String TAG = BaseFragment.this.getClass().getSimpleName();

	public void setFragmentListener(FragmentListener l) {
		mFragmentListener = l;
	}

	@Override
	public void onActivityCreated(@Nullable Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onActivityCreated(savedInstanceState);
		Log.i(TAG, "onActivityCreated");
	}

	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		Log.i(TAG, "onActivityResult");
	}

	@Override
	public void onAttach(Activity activity) {
		// TODO Auto-generated method stub
		super.onAttach(activity);
		Log.i(TAG, "onAttach");
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		Log.i(TAG, "onCreate");
	}

	@Override
	public View onCreateView(LayoutInflater inflater,
			@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		Log.i(TAG, "onCreateView");
		return super.onCreateView(inflater, container, savedInstanceState);
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.i(TAG, "onDestroy");
	}

	@Override
	public void onDestroyView() {
		// TODO Auto-generated method stub
		super.onDestroyView();
		Log.i(TAG, "onDestroyView");
	}

	@Override
	public void onDetach() {
		// TODO Auto-generated method stub
		super.onDetach();
		Log.i(TAG, "onDetach");
	}

	@Override
	public void onHiddenChanged(boolean hidden) {
		// TODO Auto-generated method stub
		super.onHiddenChanged(hidden);
		Log.i(TAG, "onHiddenChanged");
	}

	@Override
	public void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		Log.i(TAG, "onPause");
	}

	@Override
	public void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		Log.i(TAG, "onResume");
	}

	@Override
	public void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		Log.i(TAG, "onStart");
	}

	@Override
	public void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		Log.i(TAG, "onStop");
	}

	@Override
	public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onViewCreated(view, savedInstanceState);
		Log.i(TAG, "onViewCreated");
	}

	public boolean onBackPressed() {
		final Activity activity = getActivity();
		if (activity != null) {
			activity.onBackPressed();
		}
		return false;
	}

	public interface FragmentListener {

	}

}
MainActivity:主界面,首先启动fragment A, 并且管理fragmemt事务栈,与A Fragment通信

package com.example.fragment;

import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.os.Bundle;

public class MainActivity extends ActionBarActivity {

	public static final String TAG = "MainActivity";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		BaseFragment af = new AFragment();
		Bundle bundle = new Bundle();
		bundle.putString("arg", "skip a");
		af.setArguments(bundle);
		af.setFragmentListener(new AFragment.OnAClickListener() {

			@Override
			public void onAClick(String arg) {
				Log.e(TAG, "onAClick arg = " + arg);
			}
		});
		final FragmentManager fm = getSupportFragmentManager();
		FragmentTransaction ft = fm.beginTransaction();
		ft.add(R.id.fragment_content, new AFragment());
		ft.commit();

		findViewById(R.id.btn_go_to_a).setOnClickListener(
				new OnClickListener() {

					@Override
					public void onClick(View arg0) {

					}
				});
	}

	@Override
	public void onBackPressed() {
		FragmentManager fm = getSupportFragmentManager();
		if (fm.getBackStackEntryCount() > 0) {
			fm.popBackStack();
		} else {
			super.onBackPressed();
		}
	}

}

AFragment:与主界面通信,启动Fragment B, 并与Fragment B互相传值

package com.example.fragment;

import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;

public class AFragment extends BaseFragment {

	@Override
	public View onCreateView(LayoutInflater inflater,
			 ViewGroup container,  Bundle savedInstanceState) {
		return inflater.inflate(R.layout.fragment_a, container, false);
	}

	@Override
	public void onViewCreated(View view,  Bundle savedInstanceState) {
		super.onViewCreated(view, savedInstanceState);
		view.findViewById(R.id.btn_back).setOnClickListener(
				new OnClickListener() {

					@Override
					public void onClick(View arg0) {
						notifyAClick();
						onBackPressed();
					}
				});

		view.findViewById(R.id.btn_go_to_b).setOnClickListener(
				new OnClickListener() {

					@Override
					public void onClick(View arg0) {
						FragmentManager fm = getFragmentManager();
				        FragmentTransaction ft = fm.beginTransaction();
				        BaseFragment f = new BFragment();
				        Bundle bundle = new Bundle();
				        bundle.putString("arg", "skip b");
				        f.setArguments(bundle);
				        f.setFragmentListener(new BFragment.OnBClickListener() {
							
							@Override
							public void onBClick(String arg) {
								Log.e(TAG, "onBClick arg = " + arg);
							}
						});
				        ft.add(R.id.fragment_content, f);
				        ft.show(f);
				        ft.hide(AFragment.this);
				        ft.addToBackStack(null);
				        ft.commit();
					}
				});
	}

	private void notifyAClick() {
		if (mFragmentListener instanceof OnAClickListener) {
			Bundle bundle = getArguments();
			if (bundle != null) {
				((OnAClickListener) mFragmentListener).onAClick(bundle
						.getString("arg"));
			}

		}
	}

	public interface OnAClickListener extends FragmentListener {
		public void onAClick(String arg);
	}

}

BFragment:与Afragment通信


package com.example.fragment;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;

public class BFragment extends BaseFragment {

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.fragment_b, container, false);
	}

	@Override
	public void onViewCreated(View view, Bundle savedInstanceState) {
		super.onViewCreated(view, savedInstanceState);

		view.findViewById(R.id.btn_arg).setOnClickListener(
				new OnClickListener() {

					@Override
					public void onClick(View arg0) {
						notifyBClick();
					}
				});
	}

	private void notifyBClick() {
		if (mFragmentListener instanceof OnBClickListener) {
			Bundle bundle = getArguments();
			if (bundle != null) {
				((OnBClickListener) mFragmentListener).onBClick(bundle
						.getString("arg"));
			}

		}
	}

	public interface OnBClickListener extends FragmentListener {
		public void onBClick(String arg);
	}

}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值