Fragment传值

使用Fragment可能会用到传值,Fragment传值有Activity给Fragment、fragment传值给fragment

Activity传值给Fragment

1.我们在动态添加fragment是传值给fragment可以使用构造造方法,和setArgument。
在activity同setArgument传值
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		FragmentManager manager = getFragmentManager();
		FragmentTransaction transaction = manager.beginTransaction();
		DynamicFragment fragment=new DynamicFragment();
		Bundle bundle=new Bundle();
		bundle.putString("argument", "这是从activity传递的值");
		fragment.setArguments(bundle);
		transaction.add(R.id.dynamic_fragment, fragment,"dynamicFragment");
		transaction.commit();
	}
}
fragment中获取值
@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Bundle bundle=getArguments();
		String str=bundle.getString("argument");
	}
注意:使用构造方法传值时,当横竖屏切换时,构造方法传递的值数据丢失,使用setArgument方法传值,不会丢失。但setArgument方法在使用时必须在fragment与activity创建关联前传递,一旦创建关联再使用setArgument传值就会出现异常Caused by: java.lang.IllegalStateException: Fragment already active。
2.可以在Activity中创建一个成员变量,并实现该成员变量的getXXX方法,在Fragment中通过getActivity().getXXX()获取。
java中的代码
public class MainActivity extends Activity {
<span style="white-space:pre">	</span>private String str="这是从activity传递的值";
<span style="white-space:pre">	</span>


<span style="white-space:pre">	</span>public String getStr() {
<span style="white-space:pre">		</span>return str;
<span style="white-space:pre">	</span>}




<span style="white-space:pre">	</span>@Override
<span style="white-space:pre">	</span>protected void onCreate(Bundle savedInstanceState) {
<span style="white-space:pre">		</span>super.onCreate(savedInstanceState);
<span style="white-space:pre">		</span>setContentView(R.layout.activity_main);
<span style="white-space:pre">		</span>FragmentManager manager = getFragmentManager();
<span style="white-space:pre">		</span>FragmentTransaction transaction = manager.beginTransaction();
<span style="white-space:pre">		</span>DynamicFragment fragment=new DynamicFragment();
<span style="white-space:pre">		</span>transaction.add(R.id.dynamic_fragment, fragment,"dynamicFragment");
<span style="white-space:pre">		</span>transaction.commit();
<span style="white-space:pre">	</span>}
}
在fragment中的代码获取值(这里的getactivity()可以获取MainActivity的对象,因为Fragment的生命周期方法onAttach放回传一个Activity的实例)
public class DynamicFragment extends Fragment{
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		MainActivity activity=(MainActivity) getActivity();
		String str=activity.getStr();
	}
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		return inflater.inflate(R.layout.fragment_layout,container,false);
	}

}

Fragment传值给Fragment

1,两个fragment在同一个activity上,从TitleFragment传递信息给另外的一个ContentFragment。我们通常在TitleFragment中写一个接口,在activity中实现这个接口。当TitleFragment与Activity创建连接时,titleFragment的生命周期方法onAttach中就会接收到一个Activity的实例。我们把这个activity实强制类型转换成这个接口类型(多态,因为activity实现了这个接口)。当我们在titleFragment中点击按钮时回调这个接口,就可以把数据传递给activity。在activity中就可以操作ContentFragment的ui
TitleFragment代码:
public class TitleFragment extends ListFragment{
	private OnTitleClickListener titleListener;
	private String[] lists;
	/**重写这个方法,判断Activity中是否实现OnTitleClickListener接口*/
	@SuppressWarnings("deprecation")
	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		Log.i("123", "---"+activity);
			try {
				titleListener=(OnTitleClickListener) activity;
			} catch (ClassCastException e) {
				throw new ClassCastException("activity中没有实现OnTitleClickListener接口");
			}
	}
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		lists = getResources().getStringArray(R.array.title);
		ArrayAdapter<String> adapter=new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,lists);
		setListAdapter(adapter);
		return super.onCreateView(inflater, container, savedInstanceState);
	}
	
	/**在点击事件中调这个接口的onTitleClick方法*/
	@Override
	public void onListItemClick(ListView l, View v, int position, long id) {
		super.onListItemClick(l, v, position, id);
		if(titleListener!=null){
			titleListener.onTitleClick(v, lists[position]);
		}
	}
	
	/**自己定义一个数据回调的接口*/
	public interface OnTitleClickListener{
		void onTitleClick(View v,String data);
	}

}
ContentFragment代码: setTextContent(String textContent)是自己定义的用来更新fragment的TextView的内容
public class ContentFragment extends Fragment{
	private View view;
	/**显示内容内容的TextView*/
	private TextView text;
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		view=inflater.inflate(R.layout.text_content, null);
		text=(TextView) view.findViewById(R.id.textview);
		return view;
	}
	
	/**设置TextView的数据*/
	public void setTextContetn(String textContent){
		text.setText(textContent);
	}

}
MainActivity代码实现了TitleFragment的OnTitleClickListener接口,并实现了onTitleClick方法,在onTitleClick方法中调用了ContentFragment的setTextContent(String textContent)方法,
public class MainActivity extends Activity implements OnTitleClickListener {


	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		if (savedInstanceState == null) {
			initFragment();
		}
	}

	/** 动态添加fragment */
	private void initFragment() {
		FragmentTransaction transaction = getFragmentManager().beginTransaction();
		TitleFragment titleFragment = new TitleFragment();
		ContentFragment contentFragment = new ContentFragment();
		transaction.add(R.id.layout_title, titleFragment, "titleFragment");
		transaction.add(R.id.layout_content, contentFragment, "contentFrgment");
		transaction.commit();

	}

	/**
	 * 在fragment中自定义接口中的方法
	 */
	@Override
	public void onTitleClick(View v, String data) {
		Log.i("MainActivity_from_TitleFragment", data);
		// 通过标签获取ContentFragment
		ContentFragment contentFragment = (ContentFragment) getFragmentManager().findFragmentByTag("contentFrgment");
		contentFragment.setTextContetn(data);

	}


}
2.两个fragment在同一个activity的同一容器中。通常是我们在一个Fragment点击一个按钮跳显示另一个fragment。
创建Fragment1
public class MainFragment1 extends Fragment implements OnClickListener{
	private View view;
	private Button button;
	private CallBack callBack;
	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		try{
			callBack=(CallBack) activity;
		}catch(ClassCastException e){
			new ClassCastException("activity总没有实现CallBack接口");
		}
	}
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		view=inflater.inflate(R.layout.fragment_main1,container,false);
		button=(Button) view.findViewById(R.id.button1);
		button.setOnClickListener(this);
		return view;
	}
	@Override
	public void onClick(View v) {
		callBack.startFragment();
		
	}
	/**回调接口开启一个fragment*/
	public interface CallBack{
		void startFragment();
	}

}
创建一个Fragment2

public class MainFragment2 extends Fragment {
	private String textStr;
	private TextView mTextview;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Bundle bundle = getArguments();
		if (bundle != null) {
			textStr = bundle.getString("argument");
		}
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.fragment_main2, container, false);
		mTextview = (TextView) view.findViewById(R.id.text);
		mTextview.setText(textStr);
		return view;
	}

	public static MainFragment2 newInstance(String argument) {
		MainFragment2 fragment = new MainFragment2();
		Bundle bundle = new Bundle();
		bundle.putString("argument", argument);
		fragment.setArguments(bundle);
		return fragment;

	}

}
两个通用的Fragment
public class MainActivity1 extends Activity implements CallBack{


	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main1);
		FragmentManager manager = getFragmentManager();
		FragmentTransaction transaction = manager.beginTransaction();
		MainFragment1 fragment=new MainFragment1();
		transaction.add(R.id.fragment1, fragment,"fragment1");
		transaction.commit();
	}

	/**实现fragment中的CallBack接口中的startFragment方法*/
	@Override
	public void startFragment() {
		FragmentManager manager = getFragmentManager();
		Fragment fragment1 = manager.findFragmentByTag("fragment1");
		FragmentTransaction transaction = manager.beginTransaction();
		transaction.add(R.id.fragment1, MainFragment2.newInstance("这是创建fragment2"),"fragment");
		transaction.addToBackStack(null);
		transaction.hide(fragment1);//隐藏fragment1
		transaction.commit();
	}
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值