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我们也可以用同样的方法传值。
Fragment给Activity传值比较简单,我就不说了,下面代码里看吧。
新建一个NameFragment
打开MainActivity
在MainActivity中新建一个Handler
这里就简单的说一下我常用的传值方式,一两种类型相对应的,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
- Fragment之间Fragment传值
- fragment给fragment传值
- fragment与fragment,activity与fragment传值
- Fragment传值
- Fragment传值
- Fragment传值
- Fragment传值
- Fragment传值
- fragment传值
- Fragment向Fragment传值(第一种)
- Fragment向Fragment传值(第二种)
- Fragment向Fragment传值(第三种)
- fragment改viewpager中各个fragment传值
- 简单的Fragment与Fragment传值
- Android fragment 传值
- activity向Fragment传值
- Activity向Fragment传值
- 简单的fragment传值
- cocos2d-x进度条以及方向
- Android App 内存泄露之资源
- BZOJ 3098 hash killer 2 (hash)
- Linux复制粘贴快捷键
- Gulp.js 参考手册,自动化构建利器
- Fragment传值
- Android之Dialog详解
- 海量数据处理 算法总结
- 微信订阅号获取openId
- Android App 内存泄露之调试工具(1)
- 网络协议基础知识
- 编译Hadoop 2.6.0 的 eclipse插件
- iOS上应用如何兼容32位系统和64位系统
- Eclipse的单步调试