Fragment传值

来源:互联网 发布:淘宝扣分处罚规则 编辑:程序博客网 时间:2024/06/05 03:12

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

Activity传值给Fragment

1.我们在动态添加fragment是传值给fragment可以使用构造造方法,和setArgument。
在activity同setArgument传值
public class MainActivity extends Activity {@Overrideprotected 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中获取值
@Overridepublic 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{@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);MainActivity activity=(MainActivity) getActivity();String str=activity.getStr();}@Overridepublic 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")@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);Log.i("123", "---"+activity);try {titleListener=(OnTitleClickListener) activity;} catch (ClassCastException e) {throw new ClassCastException("activity中没有实现OnTitleClickListener接口");}}@Overridepublic 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方法*/@Overridepublic 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;@Overridepublic 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 {@Overrideprotected 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中自定义接口中的方法 */@Overridepublic void onTitleClick(View v, String data) {Log.i("MainActivity_from_TitleFragment", data);// 通过标签获取ContentFragmentContentFragment 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;@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);try{callBack=(CallBack) activity;}catch(ClassCastException e){new ClassCastException("activity总没有实现CallBack接口");}}@Overridepublic 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;}@Overridepublic void onClick(View v) {callBack.startFragment();}/**回调接口开启一个fragment*/public interface CallBack{void startFragment();}}
创建一个Fragment2

public class MainFragment2 extends Fragment {private String textStr;private TextView mTextview;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Bundle bundle = getArguments();if (bundle != null) {textStr = bundle.getString("argument");}}@Overridepublic 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{@Overrideprotected 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方法*/@Overridepublic 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);//隐藏fragment1transaction.commit();}}



0 0