使用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();
}
}