Fragment参数传递(二)

来源:互联网 发布:软件开发职业教育 编辑:程序博客网 时间:2024/04/29 16:57

本篇讲讲同一个Activity,不同container间的fragment参数传递问题:

这里写图片描述

方法一:直接在Activity中操作
在Activity中找到对应的控件实例,然后直接操控即可。
直接在activity中操作各个fragment的控件就可以实现消息互传。但,这样真的好吗?如果每个fragment中的控件都在Activity中操作,那还要fragment干嘛!最最起码,应该每个fragment负责自己的控件操作才对嘛!
所以,我们对这种方法进行改进,将点击Item的赋值操作放到fragment1中去。所以,这就有方法二

方法二:直接在fragment中操作

在这里我们会把所有方法写在Fragment1中,这里涉及到两方面的内容:
第一:在Fragment中如何获得自己控件的引用,比较这里Fragment1里的listview控件。
第二:在Fragment中如何获得其它Fragment页面中控件的引用,比如这里Fragment2里的TextView控件。
首先,获取自己控件引用的方法:
方法一:

public View onCreateView(LayoutInflater inflater,            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {            View view = inflater.inflate(R.layout.fragment_one, null);            listView = (ListView) view.findViewById(R.id.listview);        return view;    }

由于在onCreateView()中,还没有创建视图,所以在这里如果使用getView()方法将返回空。所以如果要获取其实图中指定控件的引用,只用用inflater.inflate()返回的rootView;在这个rootView()中用findViewById来查找。

方法二:在onActivityCreated()函数中获取

onActivityCreated()回调会在Activity的OnCreate()执行完成后再执行,也就是说,onActivityCreated()会在Activity的OnCreate()工作完成以后才会执行。所以当执行到onActivityCreated()的时候Activity已经创建完成,它其中的各个fragment也视图等等的也都已经创建完成。所在可以在这里获取跟Activity相关的各种资源。第二个问题中的获取其它Fragment页面中控件的引用也是在onActivityCreated()中来做的。先看看在onActivityCreated()中如何获得自己视图中控件的引用吧

public void onActivityCreated(@Nullable Bundle savedInstanceState) {        super.onActivityCreated(savedInstanceState);        listView =  (ListView) getView().findViewById(R.id.listview);

然后我们看看怎么获得其他fragment页面中的控件
在上面已经说了,要获取Activity中的资源,就必须等Acitivity创建完成以后,所以必须放在onActivityCreated()回调函数中。
其获取方法为:

public void onActivityCreated(@Nullable Bundle savedInstanceState) {        super.onActivityCreated(savedInstanceState);        listView =  (ListView) getView().findViewById(R.id.listview);        //获取其他fragment中控件的唯一方法        textView = (TextView) getActivity().findViewById(R.id.textview);

由上面的讲述可知,无论是获取自己视图中控件的引用还是获取其它fragment中控件的引用都可以放在onActivityCreated()函数中,所以我们就把它们全部放在onActivityCreated()中来实现了。

@Override    public void onActivityCreated(@Nullable Bundle savedInstanceState) {        super.onActivityCreated(savedInstanceState);        listView =  (ListView) getView().findViewById(R.id.listview);        //获取其他fragment中控件的唯一方法        textView = (TextView) getActivity().findViewById(R.id.textview);        listView.setAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,mStrings));        listView.setOnItemClickListener(new OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view,                    int position, long id) {                textView.setText(mStrings[position]);            }        });    }

这里要注意一点,要想在onActivityCreated方法里面通过getActivity().findViewById获得其他fragment的控件,fragment必须是静态创建的,否则会产生空指针,如果你的fragment是动态添加的,那么就必须在fragment的onStart()方法中通过此方法获取控件,大家可以做实验验证一下。

方法三:在各自的fragment中操作

好,我们先想想要怎么解决这个问题,首先,我们把各自的事件放在各自的fragment中处理,即在fragment1中能得到当前用户点击的ITEM的String字符串,在fragment2中可以设置textview的值。那问题来了,各自获得了各自的东东,那通过什么让他们交互呢?
答案显然是activity。
很显然,在activity中可以直接通过FragmentManager::findFragmentById()来获取fragment2的实例。进而调用fragment2中的任意方法,这就实现了与fragment2的通信。
那fragment1又怎么把结果回传给Activity呢?用回调,请记住。在不同页面中回传结果,回调是万能的解决方案。
(1)定义回调接口及其变量

    //定义回调接口    interface OnTextSelectedListener{        //定义回调函数        void onTextSelected(String text);    }    //定义接口变量    OnTextSelectedListener listener;

(2)调用接口变量
在点击listview条目的时候调用接口变量

    listView.setOnItemClickListener(new OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view,                    int position, long id) {                listener.onTextSelected(mStrings[position]);            }        });

(3)在MainActivity中调用setOnTextSelectedListener注册接口,并且在
onTextSelected方法中给FragmentTwo的TextView赋值。

    fragmentOne.setOnTextSelectedListener(new OnTextSelectedListener() {            @Override            public void onTextSelected(String text) {                fragmentTwo.setText(text);            }        });

整体代码如下:

public class MainActivity extends FragmentActivity {    private FragmentManager manager;    private FragmentTwo fragmentTwo;    private FragmentOne fragmentOne;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        manager = getSupportFragmentManager();        fragmentTwo = (FragmentTwo) manager.findFragmentById(R.id.fragment2);        fragmentOne = (FragmentOne) manager.findFragmentById(R.id.fragment1);        fragmentOne.setOnTextSelectedListener(new OnTextSelectedListener() {            @Override            public void onTextSelected(String text) {                fragmentTwo.setText(text);            }        });    }}
public class FragmentOne extends android.support.v4.app.Fragment{    private String[] mStrings = { "Abbaye de Belloc",            "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",            "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu",            "Airag", "Airedale", "Aisy Cendre", "Allgauer Emmentaler",            "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam",            "Abondance", "Ackawi", "Acorn", "Adelost", "Affidelice au Chablis",            "Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre",            "Allgauer Emmentaler" };    private ListView listView;    //定义回调接口    interface OnTextSelectedListener{        //定义回调函数        void onTextSelected(String text);    }    //定义接口变量    OnTextSelectedListener listener;    //定义方法,给接口对象赋值    public void setOnTextSelectedListener(OnTextSelectedListener listener){        this.listener = listener;    }    @Override    public View onCreateView(LayoutInflater inflater,            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {            View view = inflater.inflate(R.layout.fragment_one, null);            listView = (ListView) view.findViewById(R.id.listview);        return view;    }    @Override    public void onActivityCreated(@Nullable Bundle savedInstanceState) {        super.onActivityCreated(savedInstanceState);        listView =  (ListView) getView().findViewById(R.id.listview);        listView.setAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,mStrings));        listView.setOnItemClickListener(new OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view,                    int position, long id) {                listener.onTextSelected(mStrings[position]);            }        });    }}
public class FragmentTwo extends android.support.v4.app.Fragment{    private TextView textView;    @Override    @Nullable    public View onCreateView(LayoutInflater inflater,            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        View view = inflater.inflate(R.layout.fragment_two, null);        textView = (TextView) view.findViewById(R.id.textview);        return view;    }    /**     * 给TextView设置文字     * @param text     */    public void setText(String text){        textView.setText(text);    }}

好了,这篇就到这里!

0 0
原创粉丝点击