android fragment(2)

来源:互联网 发布:杭州seo外包服务 编辑:程序博客网 时间:2024/05/18 09:05

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;}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onActivityCreated(savedInstanceState);Log.i(TAG, "onActivityCreated");}@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);Log.i(TAG, "onActivityResult");}@Overridepublic void onAttach(Activity activity) {// TODO Auto-generated method stubsuper.onAttach(activity);Log.i(TAG, "onAttach");}@Overridepublic void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);Log.i(TAG, "onCreate");}@Overridepublic View onCreateView(LayoutInflater inflater,@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {// TODO Auto-generated method stubLog.i(TAG, "onCreateView");return super.onCreateView(inflater, container, savedInstanceState);}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();Log.i(TAG, "onDestroy");}@Overridepublic void onDestroyView() {// TODO Auto-generated method stubsuper.onDestroyView();Log.i(TAG, "onDestroyView");}@Overridepublic void onDetach() {// TODO Auto-generated method stubsuper.onDetach();Log.i(TAG, "onDetach");}@Overridepublic void onHiddenChanged(boolean hidden) {// TODO Auto-generated method stubsuper.onHiddenChanged(hidden);Log.i(TAG, "onHiddenChanged");}@Overridepublic void onPause() {// TODO Auto-generated method stubsuper.onPause();Log.i(TAG, "onPause");}@Overridepublic void onResume() {// TODO Auto-generated method stubsuper.onResume();Log.i(TAG, "onResume");}@Overridepublic void onStart() {// TODO Auto-generated method stubsuper.onStart();Log.i(TAG, "onStart");}@Overridepublic void onStop() {// TODO Auto-generated method stubsuper.onStop();Log.i(TAG, "onStop");}@Overridepublic void onViewCreated(View view, @Nullable Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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";@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic void onClick(View arg0) {}});}@Overridepublic 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 {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_a, container, false);}@Overridepublic void onViewCreated(View view,  Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);view.findViewById(R.id.btn_back).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {notifyAClick();onBackPressed();}});view.findViewById(R.id.btn_go_to_b).setOnClickListener(new OnClickListener() {@Overridepublic 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() {@Overridepublic 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 {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_b, container, false);}@Overridepublic void onViewCreated(View view, Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);view.findViewById(R.id.btn_arg).setOnClickListener(new OnClickListener() {@Overridepublic 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);}}


0 0
原创粉丝点击