fragment与activity之间的通信
2015-12-03 21:49
330 查看
fragment相当于一个activity,但又不能单独运行,作为一个单独的模块,调用时直接调用模块即可,对于fragment与activity之间的通信,最重要的是要注意使用包之间的统一,以免发生错误。
下面来看一下例子:
定义xml布局时要注意的一个问题是fragment布局必须设置id,否则会有解析fragment报错(具体原因不知道)
android.app.DialogFragment;
还可以采用自定义view在oncreatView中创造即可,下面我采用的是系统方式
android.app.Activity;
下面来看一下例子:
定义xml布局时要注意的一个问题是fragment布局必须设置id,否则会有解析fragment报错(具体原因不知道)
<span style="font-size:14px;"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="fragment.list.ListMainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/fragment_btn" android:text="显示对话框"/> <fragment android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/fragment_list_layout" android:layout_below="@id/fragment_btn" android:name="fragment.list.ListMainFragment"></fragment> </RelativeLayout></span>下面是定义的fragment的一个子类listFragment:
<span style="font-size:14px;">public class ListMainFragment extends ListFragment { private String[] str = {"北京","上海","成都"}; private listAdapter mAdapter; private OnFragmentDialogListener mListener; //声明回调接口 @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mAdapter = new listAdapter(getActivity()); setListAdapter(mAdapter); mAdapter.setlist(str); } @Override public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); String msg = (String) mAdapter.getItem(position); Toast.makeText(getActivity(),msg,Toast.LENGTH_SHORT).show(); onButtonPressed(msg); }</span>
<span style="font-size:14px;"> </span>
<span style="font-size:14px;"> </span>
<span style="font-size:14px;"><span style="white-space:pre"> </span>//下面是参照官方方法通过回调实现参数传递 public void onButtonPressed(String msg) { Logs.e("--------"+msg); if (mListener != null) { mListener.onFragmentDialog(msg); } } </span>
<span style="font-size:14px;"><span style="white-space:pre"> </span>//绑定activity @Override public void onAttach(Activity activity) { super.onAttach(activity); Logs.e("aaaaaaaaaaaaaa"); if (activity instanceof OnFragmentDialogListener) { mListener = (OnFragmentDialogListener) activity; } else { throw new RuntimeException(activity.toString() + " must implement OnFragmentInteractionListener"); } } </span>
<span style="font-size:14px;"><span style="white-space:pre"> </span>//我调用的包<span style="font-family:Arial, Helvetica, sans-serif;">import android.app.ListFragment ,因此当调用下面参数为context时不能运行,此错误弄了很久才弄出来,很不容易发现,若是引用包时是</span><span style="font-family: Arial, Helvetica, sans-serif;">import</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span><span style="font-family: Arial, Helvetica, sans-serif;">android.support.v4.app.ListFragment</span><span style="font-family: Arial, Helvetica, sans-serif;">;那么就可以调用下面方法了,此方法为6.0后方法</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span> // @Override // public void onAttach(Context context) { // super.onAttach(context); // Logs.e("aaaaaaaaaaaaaa"); // if (context instanceof OnFragmentDialogListener) { // mListener = (OnFragmentDialogListener) context; // } else { // throw new RuntimeException(context.toString() // + " must implement OnFragmentInteractionListener"); // } // } @Override public void onDetach() { super.onDetach(); mListener = null; } public interface OnFragmentDialogListener { //定义回调接口 // TODO: Update argument type and name void onFragmentDialog(String msg); }</span>
<span style="font-size:14px;">}</span>定义DialogFragment:注意包的调用import
android.app.DialogFragment;
还可以采用自定义view在oncreatView中创造即可,下面我采用的是系统方式
<span style="font-size:14px;">public class AlertDialogFragment extends DialogFragment { private String mArgs; public static AlertDialogFragment newInstance(String msg) { Bundle args = new Bundle(); args.putCharSequence("msg", msg); AlertDialogFragment fragment = new AlertDialogFragment(); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mArgs = getArguments().getCharSequence("msg").toString(); } } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity()); dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).setIcon(R.mipmap.ic_launcher).setMessage("欢迎来到" + mArgs); //不知怎么图标未显示,若是知道原因希望能够分享一下 Logs.e("11111111111111111111"+mArgs); return dialog.create(); }</span>activity中包导入:import
android.app.Activity;
<span style="font-size:14px;">public class ListMainActivity extends Activity implements ListMainFragment.OnFragmentDialogListener { //实现接口 private Button mDialogBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_main_layout); mDialogBtn = (Button) findViewById(R.id.fragment_btn); mDialogBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getFragmentManager().beginTransaction().add(AlertDialogFragment.newInstance(""),null).commit(); } }); } </span>
<span style="font-size:14px;"><span style="white-space:pre"> </span>//接口方法 @Override public void onFragmentDialog(String msg) { getFragmentManager().beginTransaction().add(AlertDialogFragment.newInstance(msg),null).commit(); //动态设置fragment }</span>实现效果如下:
相关文章推荐
- STB之业务架构图
- 自律
- thinkcmf 在新窗口打开链接方法
- 淘宝网技术架构介绍
- LeetCode(7) -- Reverse Integer
- 从大数据菜鸟走上大师的历程 Scala 第十二讲 trait
- 解决win10系统以太网适配器的驱动程序可能出现问题
- OC基础(24)
- [转]JAVA设计模式之单例模式
- Hibernate validation 的使用. Bean 自动校验注解
- [置顶] 友盟之微信授权登陆总结(微信授权回调响应问题)
- LeetCode Kth Smallest Element in a BST
- LintCode 更新二进制位
- eclipse的maven、Scala环境搭建
- 转载贴--自适应阈值:大津阈值法完全实现
- 根据URI获取文件的绝对路径
- Android SDK 在线更新镜像服务器资源
- webrtc(二) ns
- http文件头详解http://www.cnblogs.com/tiwlin/archive/2009/09/06/1561279.html
- 关于Intent的使用