Fragment传值

来源:互联网 发布:java 获取运行时间 编辑:程序博客网 时间:2024/05/29 19:19
今天有空,写一下Fragment传值的问题吧。传值说白了就两种类型:一、从Activity传值到Fragment;二、从Fragment中传值到Activity。至于两个Fragment之间传值,其实也就是第一个Fragment先把值传给Activity,然后Activity把值传给第二个Fragment。 
这里就简单的说一下我常用的传值方式,一两种类型相对应的,Activity给Fragment传值使用set方法,Fragment给Activity传值使用Handler。 
我简单的说一下Activity给Fragment传值: 
Fragment除了可以当做一个嵌入activity中的控件容器来看,还可以当做一个类来看,普通的类我们怎么给他传递参数,Fragment我们也可以用同样的方法传值。 

比如说我们定义的一个NameFragment中有一个TextView,我们给它取名nameText,我想要在activity中设置nameText显示的内容,我们只需要在NameFragment中添加一个属性方法

String name="";public void setName(String name){    this.name=name;}
然后在NameFragment初始化的时候调用

nameText.setText(name);
在NameFragment中我们就只需要写这么多,接下来就是在activity中传值了。新建一个NameFragment

<pre name="code" class="html">NameFragment nameFragment=new Fragment();nameFragment.setName("来自Activity的数据");
在Activity添加NameFragment之后,nameText就会显示“来自Activity的数据”了。 
Fragment给Activity传值比较简单,我就不说了,下面代码里看吧。 
新建一个NameFragment

<pre name="code" class="html">package com.example.fragmenttest;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 NameFragment extends Fragment {    private TextView nameText;    private String name = "";    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,            Bundle savedInstanceState) {        // TODO Auto-generated method stub        View view = inflater.inflate(R.layout.fragment_name, null);        nameText = (TextView) view.findViewById(R.id.fragment_name);        nameText.setText(name);        return view;    }    // 这个方法要在提交添加Fragment之前才有效    public void setName(String name) {        this.name = name;    }    // 这个方法在提交Fragment之后改变nameText显示的值    public void updateName(String name) {        nameText.setText(name);    }}
布局文件fragment_name.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:gravity="center"    android:orientation="vertical" >    <TextView        android:id="@+id/fragment_name"        android:layout_width="match_parent"        android:layout_height="wrap_content"         android:gravity="center"/></LinearLayout>
NameFragment已经建好了,下面看看怎么在Activity中使用 
打开MainActivity
<pre name="code" class="html">package com.example.fragmenttest;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends ActionBarActivity implements OnClickListener {    private NameFragment nameFragment;    private Button nameBtn, clearBtn;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        nameFragment = new NameFragment();        // 初始化传值        nameFragment.setName("来自Activity的数据");        // 在Activity中添加NameFragment        getSupportFragmentManager().beginTransaction()                .replace(R.id.nameContainer, nameFragment).commit();        init();    }    private void init() {        // TODO Auto-generated method stub        nameBtn = (Button) findViewById(R.id.btn);        nameBtn.setOnClickListener(this);        clearBtn = (Button) findViewById(R.id.clearbtn);        clearBtn.setOnClickListener(this);    }    @Override    public void onClick(View v) {        // TODO Auto-generated method stub        switch (v.getId()) {        case R.id.btn:            // 更新传值            nameFragment.updateName("来自Activity的数据");            break;        case R.id.clearbtn:            // 更新传值            nameFragment.updateName("");            break;        }    }}
布局文件activity_main.xml
<pre name="code" class="html"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <Button        android:id="@+id/btn"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_marginTop="20dp"        android:text="给Fragment传值" />    <Button        android:id="@+id/clearbtn"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_marginTop="20dp"        android:text="清除Fragment的值" />    <LinearLayout        android:id="@+id/nameContainer"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="vertical" /></LinearLayout>
这样Activity给Fragment传值就算完成了,运行截图 
<img src="http://img.blog.csdn.net/20150306154437014" alt="" />
下面看看Fragment怎么传值给Activity。 
在MainActivity中新建一个Handler

// 用于接收从Fragment中传来的值    private Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            // TODO Auto-generated method stub            super.handleMessage(msg);            switch (msg.what) {            case 0:                Toast.makeText(MainActivity.this, msg.obj.toString(),                        Toast.LENGTH_SHORT).show();                break;            }        }    };
然后给NameFragment设置handler

nameFragment.setHandler(handler);
完整代码

package com.example.fragmenttest;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.ActionBarActivity;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class MainActivity extends ActionBarActivity implements OnClickListener {    private NameFragment nameFragment;    private Button nameBtn, clearBtn;    // 用于接收从Fragment中传来的值    private Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            // TODO Auto-generated method stub            super.handleMessage(msg);            switch (msg.what) {            case 0:                Toast.makeText(MainActivity.this, msg.obj.toString(),                        Toast.LENGTH_SHORT).show();                break;            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        nameFragment = new NameFragment();        // 初始化传值        nameFragment.setName("来自Activity的数据");        nameFragment.setHandler(handler);        // 在Activity中添加NameFragment        getSupportFragmentManager().beginTransaction()                .replace(R.id.nameContainer, nameFragment).commit();        init();    }    private void init() {        // TODO Auto-generated method stub        nameBtn = (Button) findViewById(R.id.btn);        nameBtn.setOnClickListener(this);        clearBtn = (Button) findViewById(R.id.clearbtn);        clearBtn.setOnClickListener(this);    }    @Override    public void onClick(View v) {        // TODO Auto-generated method stub        switch (v.getId()) {        case R.id.btn:            // 更新传值            nameFragment.updateName("来自Activity的数据");            break;        case R.id.clearbtn:            // 更新传值            nameFragment.updateName("");            break;        }    }}
到NameFragment中修改代码
package com.example.fragmenttest;import android.os.Bundle;import android.os.Handler;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;public class NameFragment extends Fragment {    private TextView nameText;    private String name = "";    private Handler handler;    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,            Bundle savedInstanceState) {        // TODO Auto-generated method stub        View view = inflater.inflate(R.layout.fragment_name, null);        nameText = (TextView) view.findViewById(R.id.fragment_name);        nameText.setText(name);        return view;    }    // 这个方法要在提交添加Fragment之前才有效    public void setName(String name) {        this.name = name;    }    // 这个方法在提交Fragment之后改变nameText显示的值    public void updateName(String name) {        nameText.setText(name);        // 在更新nameText的时候发消息给MainActivity        handler.obtainMessage(0, "已更新NameText显示内容").sendToTarget();    }    public void setHandler(Handler handler) {        this.handler = handler;    }}
运行截图 








关于两个Fragment之间传值,上面说过了,两个Fragment之间的传值就是第一个Fragment先把值传给Activity,然后Activity把值传给第二个Fragment,自己动手试试吧。

PS:MarkDown编辑器编辑的时候很方便,预览也很好看,发布之后格式烂透了,CSDN多努力改进吧


0 0