同一个Acitivity里面Frament之间的数据传递

fragment之间的数据传递

我的博客,http://blog.csdn.net/wanxuedong,多谢支持。
今天来简单介绍一下Fragment之间的数据传递,不过是要分类讨论的,分两类,一类是Fragment直接在MainActivity对应的xml文件里面写出来,一类是Fragment在MainActivity里面用ViewPager加载进来,那么,开始。
第一种
先给出Fragment1布局和对应的java文件
xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ff00ff"
    android:orientation="vertical" >

    /*
    *这个EditText是用来输入单词的,下面的Button是用来确定的,这里输入的单词会在Fragment2里面进行显示*/
    <EditText
        android:id="@+id/put"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#000000"
        android:textSize="25sp" />

    <Button
        android:id="@+id/sure"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        android:text="确定"/>
</LinearLayout>

java文件

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Button;

public class Fragment1 extends Fragment {
    private EditText put;
    private Button sure;

    private titleSelectInterface mSelectInterface;//定义了一个接口变量
    /*
    *定义了一个接口,用来在MainActivity里面实现,就可以实现在MainActivity里面操作Fragment2了*/
    public interface titleSelectInterface {
        public void onTitleSelect(String title);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment1, container, false);
    }

/*
*下面这个函数会在主函数onCrate加载完才加载,一些控件通常在这里面找到*/
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        put = (EditText)getView().findViewById(R.id.put);
        sure = (Button)getView().findViewById(R.id.sure);
        sure.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mSelectInterface.onTitleSelect(put.getText().toString());
            }
        });

    }

/*
*用来和Activity关联的函数
*/

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mSelectInterface = (titleSelectInterface) activity;
        } catch (Exception e) {
            throw new ClassCastException(activity.toString() + "must implement OnArticleSelectedListener");
        }
    }
}

写好了Fragment1的布局和java文件,再写第二个Fragment
xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragmen2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffff00"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/fragment2_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This is fragment 2"
        android:textColor="#000000"
        android:textSize="25sp" />

</LinearLayout>

java文件:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class Fragment2 extends Fragment {
    private TextView mTv;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment2, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mTv = (TextView) getView().findViewById(R.id.fragment2_tv);
    }

/*这里写了一个方法,最后是用来给MainActivity调用的,很简单,不难理解吧*/
    public void setText(String text) {
        mTv.setText(text);
    }
}

最后给出MainActivity的布局和java文件
xml文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:baselineAligned="false" >

    <fragment
        android:id="@+id/fragment1"
        android:name="com.example.harvicblog5_3.Fragment1"
        android:layout_width="0dip"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <fragment
        android:id="@+id/fragment2"
        android:name="com.example.harvicblog5_3.Fragment2"
        android:layout_width="0dip"
        android:layout_height="match_parent"
        android:layout_weight="1" />
</LinearLayout>

java文件:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;


public class MainActivity extends FragmentActivity implements Fragment1.titleSelectInterface {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

/*
*没错,关键就是在这里,这里实现了Fragment1里面的抽象类,并且用FragmentManager找到了Fragment2,并调用了里面的setText方法,实现了更换字符串的功能*/
    @Override
    public void onTitleSelect(String title) {
        FragmentManager manager = getSupportFragmentManager();
        Fragment2 fragment2 = (Fragment2)manager.findFragmentById(R.id.fragment2);
        fragment2.setText(title);
    }
}

好了,代码打完了,其实第一种方法也就说完了,注释都很详细,没什么难点,就是回调的实现过程,接下来继续。
第二种:
第二种跟第一种不同之点就是用ViewPager加载了这两个Fragment,主要需要改的就是MaiActivity的布局和对应的xml文件,给出代码
xml文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

java文件:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;

import java.util.ArrayList;

public class MainActivity extends FragmentActivity implements Fragment1.titleSelectInterface {

    private ViewPager viewPager;
    private ArrayList<Fragment> list;
    private FragmentPagerAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        viewPager = (ViewPager)findViewById(R.id.viewPager);
        list = new ArrayList<Fragment>();
        list.add(new Fragment1());
        list.add(new Fragment2());
        adapter = new viewPagerAdapter(getSupportFragmentManager(), list);
        viewPager.setAdapter(adapter);
    }

/*
*这里写了一个适配器,是给viewPager的,为了将两个Fragment添加进MainActivity里面去,下面是必须写的三个方法*/
    private class viewPagerAdapter extends FragmentPagerAdapter
    {

        private viewPagerAdapter(FragmentManager fm, ArrayList<Fragment> array)
        {
            super(fm);
        }

        @Override
        public int getCount() {
            return list.size();
        }

/*
*没错,这里我们改了代码,原本的FragmentManager不见了,取而代之的是list,这样的话就可以找到Fragment2了,就可以为所欲为啦,不过有的同学想那之前的方法不能用在这里面吗?答案是不可以的,以为你写VewPager的话Fragment1和Fragmet2就没办法设置id了,也就没办法找到了, 就更不能操作了*/
        @Override
        public Fragment getItem(int position) {
            return list.get(position);
        }
    }

    @Override
    public void onTitleSelect(String title) {
        Fragment2 fragment2 = (Fragment2) adapter.getItem(1);
        fragment2.setText(title);
    }
}

相比之前的代码要多不少,不过主要代码还是为了添加Fragment进ViewPager里面去罢了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值