activity,fragment传值

  

   activity,fragment数据交换,  平常总是使用到activity和fragment, 所以必须得搞懂他们怎样传值。


    activity传值给fragment  据我所知。 大概有这么几种方式  构造函数传值, setargment传值,get set方法传值,广播传值,回调传值以及静态字段传值

     对于这几种方式, 我推荐用setargment方式, 谷歌表示不建议构造函数传值,  ,回调太费事, 广播也不推荐,杀鸡焉用牛刀,广播是处理组件的通信的。

  

        先说说setargments.方式


  Button是用于回调的使用。 现在可以当做没看到, 后面我会讲到.    main布局中有个viewpager,

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
       android:orientation="vertical"
    tools:context="com.example.administrator.activityfragment.MainActivity">

    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:id="@+id/viewpager"
        android:layout_height="500dp"></android.support.v4.view.ViewPager>
    <Button
        android:layout_width="wrap_content"
        android:text="传值"
        android:id="@+id/btn"
        android:layout_height="wrap_content" />
</LinearLayout>
   
      activity部分代码。  没写全, 不过应该看得懂,  里面自己写了个2个fragment和一个 
FragmentAdapter 

requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
viewPager= (ViewPager) findViewById(viewpager);
btn= (Button) findViewById(R.id.btn);
list=new ArrayList<Fragment>();
 Fragment1 fragment1=new Fragment1();
Fragment2 fragment2=new Fragment2();
list.add(fragment1);
list.add(fragment2);

viewPager.setAdapter(new FragmentAdapter(getSupportFragmentManager(),list));

 fragment 1 和framgnet 2 没什么区别。 我贴一个代码就行了

      这个fragment布局就不贴了。 布局中就一个textview控件   这里我先不讨论bundle和main的作用

  

 TextView tv;
MainActivity main;
 Bundle bundle;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.fragment1_layout,null);
    initView(view);

    return view;
}

private void initView(View view) {
    tv= (TextView) view.findViewById(R.id.text);
    main= (MainActivity) getActivity();
    bundle=getArguments();
 好了。 大概就是这样, 我们回到Activity中。
  代码不贴了, 上面activity中我贴过, 里面实例化了两个fragment, 然后通过一个list集合传到adapter,然后viewpager
 填充这个adapter,
   activity代码中,   我们通过fragment1对象调用了.setArguments();方法, 参数为bunlde, 所以我们创建了个bundle,
  bundle内部是key-values,的形式存储数据,  键名我给的"傻逼",值是sb,
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);
    viewPager= (ViewPager) findViewById(viewpager);
    btn= (Button) findViewById(R.id.btn);
    list=new ArrayList<Fragment>();
     Fragment1 fragment1=new Fragment1();
    Fragment2 fragment2=new Fragment2();
    list.add(fragment1);
    list.add(fragment2);


    viewPager.setAdapter(new FragmentAdapter(getSupportFragmentManager(),list));
  
     Bundle bundle=new Bundle();
      bundle.putString("傻逼","sb");
     fragment1.setArguments(bundle)    
 回到fragment1代码中,  我们通过getargment方法来获取一个buldle对象,然后通过budle对象给textview赋值。
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.fragment1_layout,null);
    initView(view);

    return view;
}

private void initView(View view) {
    tv= (TextView) view.findViewById(R.id.text);
    main= (MainActivity) getActivity();
    bundle=getArguments();
tv.setText(bundle.getString("傻逼"));
 现在运行下程序。 
  
 可以看到sb 的数据传过来的, 这是第一种。
 然后第二种。 构造函数传值 
     在fragment1中给个构造函数带个string参数
public class Fragment1  extends Fragment  {

     public String data;
     public void  Fragment1(String data)
     {
          this.data=data;
     }
  然后在activity中 实例化fragment1 将你需要的数据传过去,
Fragment1 fragment1=new Fragment1("构造函数传值");
 
  然后在fragment中把data数据给textview控件
tv.setText(data);
  现在运行下程序,  不知道为啥。 图片贴不了,   你们可以自己调试结果就知道了。
  在你使用这种方法的时候, fragment会有红色下划线出现,光标移上去会显示一段文字,大概意思是讲
   不推荐用构造来传值, 因为fragment会自动默认构造函数,推荐使用argments
  
    
  第三种。 就是通过回调传值
    说到回调, 此时button按钮就起作用了。
 实例化button 这个不要我讲了吧。 然后然后创建个接口,和接口对象。 然后创建个方法,把接口对象赋给自己创建的接口
interface  Ballcak
{
    public void back(String str);
}
Ballcak ballcak=null;
public void  setballback(Ballcak ballcak )
{
    this.ballcak=ballcak;

}
  在button的onclick中调用
back(String str);方法
 
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
         ballcak.back("我去。 你是sb");
    }
});
  然后在fragment中。 通过getactivity得带activity对象。
main= (MainActivity) getActivity();
  然后通过这个main对象来调用
setballback();方法
main.setballback(new MainActivity.Ballcak() {
    @Override
    public void back(String str) {
         tv.setText(str+"..");
    }
});
 点击运行程序。 textview的值就是
我去。 你是sb 

 后面的几种。 可以自己去试一试, 比较简单。 这里我就不啰嗦了。 
   



 
     
     



  


 

 



  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值