Android Fragment全解析+Fragment与Activity通信
2015-12-25 23:01
676 查看
今天在做项目的时候,用到了平时再也熟悉不过的Fragment,其中涉及到了Activity与Fragment之间的通信,仔细探究发现没有那么容易,这里总结一下在自己项目中的应用。
参考博客:
/article/1336252.html
/article/1336251.html
/article/1580275.html
这里都是鸿洋有关Fragment详解,我就不班门弄斧,
主要讲的是自己的Fragment应用与通信的实现。
简化一下业务逻辑:Activity中,有一个Textview,并且动态添加了一个Fragment,在Fragment中有两个Edittext,两个Button:
1.点击第一个Button的时候,在Activity中,得到Fragment里这两个Edittext的值;
2.点击第二个Button的时候,在Activity中,Textview的值进行更新
OK,上代码,边写边说:
首先是第一种通信方式,接口回调机制
1.布局文件:
activity的布局:
fragment的布局:
都很简单,没什么可说的。
2.代码实现:
在myfragment里面:
@Override
我写了一个接口,在接口里面写了提交的方法,携带两个参数,然后在activity中去实现这个接口
什么时候去实现这个回调呢,在点击button的时候,首先需要申明这个接口对象,并且为之赋值,这里调用接口方法的是activity,所以将这个activity赋值给接口对象,强转类型即可。这里得到当前activity有两个方法:
在fragment的onattach生命周期中,onAttach(Activity),当Fragment与Activity发生关联时调用。
或者直接getActivity()也可以
得到接口对象以后,执行里面的方法,得到两个Edittext的值。最后一点击button,执行回调,activity中得到两个值并且进行简单的显示,这样就通过接口回调机制来完成了fragment向activity通信传值的一种方式。
可参考
/article/3690189.html
接下来是第二种广播实现通信:
这个实现起来也比较简单,在宿主Activity里面注册广播,当需要通信的时候在Fragment中发送广播,宿主Activity中接受到广播,进行相应处理即可。这种方式比较灵活,也比较简单,没有接口回调那么多接口和处理。Fragment和Activity之间耦合度也较低。
在activity里面,动态注册了一个广播用来接收来自fragment的广播消息,当有消息传递时候,将值拿出来进行显示:
在fragment里面,点击button发送广播,比较简单:
最后贴上效果图:
Avtivity向对应跳转,加载的Fragment中传递数据,可以采用setArguements()方法,这个不是很复杂。
最后一种通信方式是eventbus,这个最近在学习中,以后贴上学习经验~~~
参考博客:
/article/1336252.html
/article/1336251.html
/article/1580275.html
这里都是鸿洋有关Fragment详解,我就不班门弄斧,
主要讲的是自己的Fragment应用与通信的实现。
简化一下业务逻辑:Activity中,有一个Textview,并且动态添加了一个Fragment,在Fragment中有两个Edittext,两个Button:
1.点击第一个Button的时候,在Activity中,得到Fragment里这两个Edittext的值;
2.点击第二个Button的时候,在Activity中,Textview的值进行更新
OK,上代码,边写边说:
首先是第一种通信方式,接口回调机制
1.布局文件:
activity的布局:
[code] <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/txt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" android:text="这里的值将会改变" /> <LinearLayout android:layout_marginTop="40dp" android:id="@+id/fragment_ll" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > </LinearLayout> </LinearLayout>
fragment的布局:
[code]<LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:id="@+id/username_edt" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <EditText android:id="@+id/password_edt" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/interface_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="接口按钮" /> <Button android:id="@+id/broadcast_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="广播按钮" /> </LinearLayout>
都很简单,没什么可说的。
2.代码实现:
在myfragment里面:
@Override
[code]public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.my_fragment, container, false); context = getActivity(); return view; } public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); initview(); } @Override public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); submit = (Submit) activity; } public interface Submit { public void submit(String userStr, String passStr); } private void initview() { userEdt = (EditText) getView().findViewById(R.id.username_edt); passEdt = (EditText) getView().findViewById(R.id.password_edt); inBtn = (Button) getView().findViewById(R.id.interface_btn); inBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { submit = (Submit) getActivity(); submit.submit(userEdt.getText().toString().trim(), passEdt .getText().toString().trim()); } }); brBtn = (Button) getView().findViewById(R.id.broadcast_btn); brBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { } }); }
我写了一个接口,在接口里面写了提交的方法,携带两个参数,然后在activity中去实现这个接口
[code]public interface Submit { public void submit(String userStr, String passStr); }
[code]public class MainActivity extends Activity implements Submit { TextView txt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); initview(); } @SuppressLint("NewApi") private void initview() { Fragment fragment = new MyFragment(); FragmentTransaction fm = getFragmentManager().beginTransaction(); fm.replace(R.id.fragment_ll, fragment); fm.commit(); } @Override public void submit(String userStr, String passStr) { Toast.makeText(getApplicationContext(), "username:" + userStr + "password:" + passStr, Toast.LENGTH_LONG).show(); }
什么时候去实现这个回调呢,在点击button的时候,首先需要申明这个接口对象,并且为之赋值,这里调用接口方法的是activity,所以将这个activity赋值给接口对象,强转类型即可。这里得到当前activity有两个方法:
[code] @Override public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); submit = (Submit) activity; }
在fragment的onattach生命周期中,onAttach(Activity),当Fragment与Activity发生关联时调用。
[code]submit = (Submit) getActivity();
或者直接getActivity()也可以
得到接口对象以后,执行里面的方法,得到两个Edittext的值。最后一点击button,执行回调,activity中得到两个值并且进行简单的显示,这样就通过接口回调机制来完成了fragment向activity通信传值的一种方式。
可参考
/article/3690189.html
接下来是第二种广播实现通信:
这个实现起来也比较简单,在宿主Activity里面注册广播,当需要通信的时候在Fragment中发送广播,宿主Activity中接受到广播,进行相应处理即可。这种方式比较灵活,也比较简单,没有接口回调那么多接口和处理。Fragment和Activity之间耦合度也较低。
在activity里面,动态注册了一个广播用来接收来自fragment的广播消息,当有消息传递时候,将值拿出来进行显示:
[code]private IntentFilter intentFilter; private BroadReceiver broadReceiver; intentFilter = new IntentFilter(); intentFilter.addAction("android.text_change"); broadReceiver = new BroadReceiver(); registerReceiver(broadReceiver, intentFilter); } public class BroadReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle data= intent.getExtras(); txt.setText(data.getString("text")); }
在fragment里面,点击button发送广播,比较简单:
[code]brBtn = (Button) getView().findViewById(R.id.broadcast_btn); brBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent("android.text_change"); intent.putExtra("text", "这里是通过广播传递的值,啦啦啦啦啦"); getActivity().sendBroadcast(intent); } });
最后贴上效果图:
Avtivity向对应跳转,加载的Fragment中传递数据,可以采用setArguements()方法,这个不是很复杂。
最后一种通信方式是eventbus,这个最近在学习中,以后贴上学习经验~~~
相关文章推荐
- Android动画使用方式详解
- Intent 和Intent-filter
- Android ListView观察者模式浅析
- LogHtml-Android本地日志工具
- Apktool反编译工具的使用
- android findviewByid()关于空指针
- android View的事件体系
- android adt中R程序丢失
- Android之Toast
- 【Android】error opening trace file: No such file or directory (2)
- Android:自定义的Toast
- Android开发之自定义控件
- Android基本知识
- Android之完美退出方法(2.1-2.2-2.3SDK版本测试通过)
- android 5.0+6.0新特性
- android 圆角图片的实现
- 电脑上控制Android手机录制屏幕
- Android四大组件之:service
- Android Material Design:PopupMenu
- 关于android端的json传输