黑马程序员技术交流社区

标题: [深圳特色][问答网]如何在Fragment和Activity中传递数据? [打印本页]

作者: 深圳黑马程序员    时间: 2015-12-17 16:42
标题: [深圳特色][问答网]如何在Fragment和Activity中传递数据?

面试的时候是不是经常被面试官问一句:Fragment和Activity之间怎样通讯?然后就懵了?其实很简单的,首先Fragemtn就是一个普通的java类,它并没有继承其他的父类。而且,Fragment总是由你自己new出来,因此要通讯最高效的方式当然就是持有引用,调用方法了。下面看看深圳的技术辅导老师(同时也叫就业指导老师)在问答网上关于这个问题的回答。





学生问题:老师我遇到一个工作上面的问题,需要从fragment传递数据到activity

老师回答:

第一种数据方式fragment和activity,方式是使用getacitivity方法传递数据:
代码如下:
例如:从acitivity中传递fragment,fragment里面如下:
  1. ((MainActivity)getActivity()).setmTitle("aaaaaaaaaaaa");
复制代码
发送数据的acitivity里面这需要写如下代码:
  1. public void setmTitle(String title) {
  2.     this.mTitle = title;
  3. }
复制代码
第二种,如果是同一个Activity中要加载很多Fragment的话、这种方法无疑要简单很多
第二种传递方式,采用fragment原生的apisetargusments方法。
acitivity里面代码:
  1. //事务
  2.       ft =  fm.beginTransaction();
  3.        StrogeFragment fragment = new StrogeFragment();
  4.         Bundle bundle = new Bundle();  
  5.         bundle.putString("key", "这是方法二");  
  6.         fragment.setArguments(bundle);  
  7.          
  8.          
  9.        ft.replace(R.id.container, fragment);
  10.        ft.commit();
复制代码
fragment里面的接收代码:
  1. string = getArguments().getString("key");  
  2.             Log.e("StrogeFragment",string);
复制代码

第三种传递方式可以采用接口:
接口的代码:
  1. package com.example.fragmentback;
  2.   
  3. import android.os.Bundle;
  4.   
  5. public interface FragmentCallBack {
  6.     public void callbackFun1(Bundle arg);
  7.   
  8.     public void callbackFun2(Bundle arg);
  9. }
复制代码
第一个fragment类:
  1. package com.example.fragmentback;
  2.   
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.support.v4.app.Fragment;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.view.ViewGroup;
  10. import android.widget.Button;
  11.   
  12.   
  13.   
  14. public class Fragmentone extends Fragment {
  15.      
  16.    FragmentCallBack fragmentCallBack = null;
  17.    private Button btn;
  18.    @Override
  19.    public View onCreateView(LayoutInflater inflater, ViewGroup container,
  20.            Bundle savedInstanceState) {
  21.        View rootView = inflater.inflate(R.layout.fragment1, container,
  22.                false);
  23.        btn = (Button)rootView.findViewById(R.id.btn);
  24.        btn.setOnClickListener(new OnClickListener() {
  25.             
  26.            @Override
  27.            public void onClick(View v) {
  28.                fragmentCallBack.callbackFun1(null);
  29.            }
  30.        });
  31.        return rootView;
  32.    }
  33.      
  34.    @Override
  35.    public void onAttach(Activity activity) {
  36.        // TODO Auto-generated method stub
  37.        super.onAttach(activity);
  38.        fragmentCallBack = (MainActivity)activity;
  39.    }
  40. }
复制代码
第二个fragment类:
  1. package com.example.fragmentback;
  2.   
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.support.v4.app.Fragment;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.view.ViewGroup;
  10. import android.widget.Button;
  11. import android.widget.Toast;
  12.   
  13.   
  14. public class Fragmenttwo extends Fragment {
  15.       
  16.     FragmentCallBack fragmentCallBack = null;
  17.     Button btn1;
  18.     Button btn2;
  19.     @Override
  20.     public View onCreateView(LayoutInflater inflater, ViewGroup container,
  21.             Bundle savedInstanceState) {
  22.         View rootView = inflater.inflate(R.layout.fragment2, container,
  23.                 false);
  24.         Bundle data = getArguments();//获得从activity中传递过来的值
  25.         Toast.makeText(getActivity(), data.getString("TEXT"), Toast.LENGTH_SHORT).show();
  26.         btn1 = (Button)rootView.findViewById(R.id.btn1);
  27.         btn1.setOnClickListener(new OnClickListener() {
  28.               
  29.             @Override
  30.             public void onClick(View v) {
  31.                 // 直接调用Activity中的方法
  32.                ((MainActivity) getActivity()).changeButtonColor();
  33.             }
  34.         });
  35.         btn2 = (Button)rootView.findViewById(R.id.btn2);
  36.         btn2.setOnClickListener(new OnClickListener() {
  37.               
  38.             @Override
  39.             public void onClick(View v) {
  40.                 // 回调的方式
  41.                 fragmentCallBack.callbackFun2(null);
  42.             }
  43.         });
  44.         return rootView;
  45.     }
  46.       
  47.     @Override
  48.     public void onAttach(Activity activity) {
  49.         // TODO Auto-generated method stub
  50.         super.onAttach(activity);
  51.         fragmentCallBack = (MainActivity)activity;
  52.     }
  53. }
复制代码
主要activity类:
  1. package com.example.fragmentback;
  2. import android.app.Activity;
  3. import android.graphics.Color;
  4. import android.os.Bundle;
  5. import android.support.v4.app.Fragment;
  6. import android.support.v4.app.FragmentActivity;
  7. import android.support.v4.app.FragmentManager;
  8. import android.support.v4.app.FragmentTransaction;
  9. import android.view.View;
  10. import android.view.View.OnClickListener;
  11. import android.widget.Button;
  12. public class MainActivity extends FragmentActivity implements FragmentCallBack{
  13.       
  14.     private Button btn;
  15.       
  16.     private Fragmentone fragment1;
  17.     private Fragmenttwo fragment2;
  18.     private FragmentManager fragmentManager;
  19.     private Fragment currentFragment;
  20.     @Override
  21.     protected void onCreate(Bundle savedInstanceState) {
  22.         super.onCreate(savedInstanceState);
  23.         setContentView(R.layout.activity_main);
  24.         fragmentManager = getSupportFragmentManager();
  25.          
  26.         FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  27.         fragmentTransaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
  28.         fragment1 = new Fragmentone();
  29.         Bundle data = new Bundle();
  30.         data.putString("TEXT", "这是Activiy通过Bundle传递过来的值");
  31.         fragment1.setArguments(data);//通过Bundle向Activity中传递值
  32.         fragmentTransaction.add(R.id.rl_container,fragment1);//将fragment1设置到布局上
  33.         fragmentTransaction.addToBackStack(null);
  34.         fragmentTransaction.commitAllowingStateLoss();
  35.         currentFragment = fragment1;
  36.         //初始化button控件
  37.         btn = (Button)findViewById(R.id.btn);
  38.         btn.setOnClickListener(new OnClickListener() {
  39.             @Override
  40.             public void onClick(View v) {
  41.                 if(currentFragment instanceof Fragmentone){
  42.                     switchFragment();
  43.                 }else{//当前是fragment2,因此,只需要将fragment2出栈即可变成fragment1
  44.                     fragmentManager.popBackStack();
  45.                     currentFragment = fragment1;
  46.                 }
  47.             }
  48.         });
  49.     }
  50.     /**
  51.      * 切换Fragment
  52.      */
  53.     private void switchFragment(){
  54.         if(null == fragment2){//可以避免切换的时候重复创建
  55.             fragment2 = new Fragmenttwo();
  56.         }
  57.         Bundle data = new Bundle();
  58.         data.putString("TEXT", "传递给fragment2");
  59.         fragment2.setArguments(data);
  60.         FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  61.         fragmentTransaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
  62.          
  63.         fragmentTransaction.replace(R.id.rl_container,fragment2);
  64.         fragmentTransaction.addToBackStack(null);
  65.         fragmentTransaction.commitAllowingStateLoss();
  66.         currentFragment = fragment2;
  67.     }
  68.       
  69.     public void changeButtonColor(){
  70.         btn.setBackgroundColor(Color.RED);
  71.     }
  72.   
  73.     @Override
  74.     public void callbackFun1(Bundle arg) {
  75.         switchFragment();//通过回调方式切换
  76.     }
  77.   
  78.     @Override
  79.     public void callbackFun2(Bundle arg) {
  80.         changeButtonColor();//通过回调方式调用Activity中的方法
  81.     }
  82.   
  83. }
复制代码

这是采用java接口原理来实现。


[深圳特色] 揭秘内部问答网中经典问题,每周更新!
深圳校区除了全国独有问答网,就业老师面试服务,还有更多神秘惊喜等着你,咨询热线:0755-66689855




作者: 18338762337    时间: 2015-12-17 18:46
牛,顶,学习中
作者: lixy    时间: 2015-12-18 23:21
这是在eclipse上写的吗?
作者: cj286    时间: 2015-12-24 22:23
每种方式都适用于什么情况下啊,是不是在代码中应多用接口啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2