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里面去罢了。