Fragment 创建 传递参数 跳转【典例】
- 1、如果能拿到此Activity的实例,可以直接调用相应的方法加载此Fragment,当跳到此Activity时它显示的就已经是某个Fragment了
- 2、通过startActivity先跳到此页面,并传递过来一个参数,在Activity的oncreate方法中提取此参数,满足条件时加载需要的Fragment
- 3、通过EventBus等发送一条事件,当Activity收到后加载需要的Fragment
* BaseActivity 管理fragment的创建,防止屏幕旋转等情况下fragment重叠现象
/*** 抽象一个Activity托管我们的Fragment* @author 白乾涛*/public abstract class BaseFragmentActivity extends Activity {protected abstract Fragment createFragment();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_single_fragment);Fragment fragment = getFragmentManager().findFragmentById(R.id.id_fragment_container);if (fragment == null) {//为什么要在创建fragment前判断它是否为null?//当【Activity】因为屏幕旋转或者因内存不足被系统杀死时,会导致Activity被重新创建,但是这时我们的【fragment】是会被完整保存下来的(系统机制)//并且当Activity被重建时,FragmentManager会首先去获取保存下来的fragment队列,重建fragment队列,因此就可以恢复之前的状态了//所以这里需要判断fragment是否为null,不为空就表明fragment是已经创建过的,此时不需要(也不能)再创建新的fragment,否则会出现多个fragment重叠现象fragment = createFragment();//add方法中id的作用:1、告知fm此fragment的位置;2、此后可以通过findFragmentById找到它getFragmentManager().beginTransaction().add(R.id.id_fragment_container, fragment).commit();}//做你需要的其他事情}}<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="我是标题,我下面是一个用于填充Fragment的容器(FrameLayout)"android:textColor="#f00"android:textSize="12sp" /><!-- 填充Fragment的容器 --><FrameLayoutandroid:id="@+id/id_fragment_container"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>
* 两个Activity 只负责返回具体的fragment,但不负责fragment的创建细节
public class MainActivity extends BaseFragmentActivity {@Overrideprotected Fragment createFragment() {return new ListTitleFragment(); //当创建的Fragment 不需要参数时,可以直接new}}
public class ContentActivity extends BaseFragmentActivity {@Overrideprotected Fragment createFragment() {//获取从fragment中传递过来的数据String title = getIntent().getStringExtra(ContentFragment.ARGUMENT);return ContentFragment.newInstance(title);//当创建的Fragment需要参数(数据)时,最好交给Fragment自己去处理}}
* Fragment1-标题列表 跳转到Activity 并获取返回的数据
public class ListTitleFragment extends ListFragment {//public class ListFragment extends Fragment/**结果码*/public static final int REQUEST_DETAIL = 0x110;private List<String> mTitles = Arrays.asList("包青天", "白乾涛", "baiqiantao", "0909082401");private int mCurrentPos;private ArrayAdapter<String> mAdapter;@Overridepublic void onViewCreated(View view, Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);setListAdapter(mAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, mTitles));}@Overridepublic void onListItemClick(ListView l, View v, int position, long id) {mCurrentPos = position;//可以从Fragment中跳转到其他ActivityIntent intent = new Intent(getActivity().getApplicationContext(), ContentActivity.class);//可以携带数据intent.putExtra(ContentFragment.ARGUMENT, mTitles.get(position));//并且可以获取反馈startActivityForResult(intent, REQUEST_DETAIL);}@Override//获取由此Fragment启动的另一个Activity中的一个ContentFragment结束时,ContentFragment返回的数据(数据结束时返回的)public void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_DETAIL && data != null) {String responseEvaluate = data.getStringExtra(ContentFragment.RESPONSE);if (TextUtils.isEmpty(responseEvaluate)) responseEvaluate = "你还没有评价";mTitles.set(mCurrentPos, mTitles.get(mCurrentPos) + " ___ " + responseEvaluate);mAdapter.notifyDataSetChanged();} else Toast.makeText(getActivity(), "你还没有评价哦~", Toast.LENGTH_SHORT).show();}}
* Fragment2-内容 创建带参数的Fragment 启动另一个Fragment 获取返回数据、返回数据
public class ContentFragment extends Fragment {/**构造时传入的值**/private String mArgument;/**构造时传入的参数**/public static final String ARGUMENT = "argument";/**当前Fragment返回结果时的返回值对应的Tag*/public static final String RESPONSE = "response";/**为启动的DialogFragment设置一个Tag,方便以后通过findFragmentByTag(tag)找到此Fragment*/public static final String EVALUATE_DIALOG = "evaluate_dialog";/**启动另一个Fragment时的请求码*/public static final int REQUEST_CODE_EVALUATE = 0X110;/**构造时把传入的参数带进来,注意一定要通过Bundle及setArguments传递数据*/public static ContentFragment newInstance(String argument) {//把所有需要传递的数据都放在Bundle中Bundle bundle = new Bundle();bundle.putString(ARGUMENT, argument);ContentFragment contentFragment = new ContentFragment();//通过setArguments把Bundle传递过去contentFragment.setArguments(bundle);return contentFragment;}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//获取传递过来的数据Bundle bundle = getArguments();if (bundle != null) mArgument = bundle.getString(ARGUMENT);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {TextView tv = new TextView(getActivity());tv.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));tv.setText(mArgument);//在一个Fragment中启动另一个Fragmenttv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {EvaluateDialog dialog = new EvaluateDialog();//注意要设置setTargetFragment,这里的参数表示【此Fragment返回时的目标Fragment】【启动此Fragment时的请求码】dialog.setTargetFragment(ContentFragment.this, REQUEST_CODE_EVALUATE);dialog.show(getFragmentManager(), EVALUATE_DIALOG);}});return tv;}@Override//当另一个Fragment结束时,接收其返回回来的数据public void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_CODE_EVALUATE && data != null) {//根据返回数据的Fragment返回的数据中的Tag,获取返回数据中我们需要的值String evaluate = data.getStringExtra(EvaluateDialog.RESPONSE_EVALUATE);Toast.makeText(getActivity(), "你的评价为:" + evaluate, Toast.LENGTH_SHORT).show();//将获取到的结果返回Intent intent = new Intent();intent.putExtra(RESPONSE, evaluate);getActivity().setResult(ListTitleFragment.REQUEST_DETAIL, intent);//第一个参数代表结果码,在启动者中定义}}}
* DialogFragment 返回数据到目标Fragment
/**这是在同一个Activity中,由另一个Fragment启动的一个DialogFragment*/public class EvaluateDialog extends DialogFragment {private String[] mEvaluteVals = new String[] { "优", "差", "良" };/**返回的数据的Key或Tag或Name*/public static final String RESPONSE_EVALUATE = "response_evaluate";@Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());builder.setTitle("请选择评价 :")//.setCancelable(false)//.setOnCancelListener(null)//.setOnItemSelectedListener(null)//.setIcon(R.drawable.ic_launcher)//.setItems(mEvaluteVals, new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {setResult(which);}});return builder.create();}// 设置返回数据protected void setResult(int which) {// 判断是否设置了targetFragmentif (getTargetFragment() == null) return;Intent intent = new Intent();intent.putExtra(RESPONSE_EVALUATE, mEvaluteVals[which]);//手动调用onActivityResultt进行返回数据,【请求码:由目标Fragment决定】【响应码:由自身决定,要求不严格的话也可随便设置一个】getTargetFragment().onActivityResult(ContentFragment.REQUEST_CODE_EVALUATE, Activity.RESULT_OK, intent);}}
附件列表
Fragment 创建 传递参数 跳转【典例】的更多相关文章
- Fragment 创建 传递参数 跳转 典例
抽取的控制Fragment的父Activity /** * 抽象一个Activity托管我们的Single Fragment */ public abstract class SingleFrag ...
- Android——软键盘操作+fragment之间传递参数+TextView限制字数,显示"..."
原文地址: Android 手动显示和隐藏软键盘 Android隐藏输入法键盘(hideSoftInputFromInputMethod没有效果) Android Fragment传递参数_Fragm ...
- Python Unittest根据不同测试环境跳过用例详解
虽然现在用的Katalon,不过这篇Unittest基本的用法讲的还是不错的 转自:https://mp.weixin.qq.com/s/ZcrjOrJ1m-hAj3gXK9TjzQ 本文章会讲述以下 ...
- Fragment 回退栈 传递参数,点击切换图片使用Fragment ListView
Fragment回退栈 类似与Android系统为Activity维护一个任务栈,我们也可以通过Activity维护一个回退栈来保存每次Fragment事务发生的变化. 如果你将Fragment任务 ...
- Android解惑 - 为什么要用Fragment.setArguments(Bundle bundle)来传递参数(转)
Fragment在Android3.0开始提供,并且在兼容包中也提供了Fragment特性的支持.Fragment的推出让我们编写和管理用户界面更快捷更方便了. 但当我们实例化自定义Fragmen ...
- android fragment传递参数_fragment之间传值的两种方法
在Activity中加载Fragment的时候.有时候要使用多个Fragment切换.并传值到另外一个Fragment.也就是说两个Fragment之间进行参数的传递.查了很多资料.找到两种方法.一种 ...
- [Xcode 实际操作]九、实用进阶-(24)使用Segue(页面的跳转连接)进行页面跳转并传递参数
目录:[Swift]Xcode实际操作 本文将演示使用Segue(页面的跳转连接)进行页面跳转并传递参数. 参照结合:[Xcode10 实际操作]九.实用进阶-(23)多个Storyboard故事板中 ...
- 如何向一个Fragment传递参数---setArguments方法的介绍
在我们平常开发中经常会用到Fragment,当我们使用Fragment时一般是通过new Fragment的构造方法来实现,如果我问你怎么向一个Fragment传递参数,你是不是会首先想到通过构造方法 ...
- js跳转传递参数
额,利用j获取了GridView中选中行数据后,通过JavaScript做跳转,传递参数的时候发现,当参数有中文的时候就会乱码, 当然出现这种情况的时候就需要对跳转的url进行编码 var urlX ...
随机推荐
- vim常见操作命令
打开多文件vim file1 file2:open/:e 不关闭vim打开文件 分帧窗口:new 新窗口:sp 横向:vsp 纵向ctrl+w窗口切换:tabc 关闭当前窗口:tabo 关闭所有窗口: ...
- 机器寻径引导算法C#(最短路径表)
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...
- SCU 4443 Range Query
二分图最大匹配,枚举. 可以计算出每一个位置可以放哪些数字,每个数字可以放在哪些位置,这样就可以建二分图了. 如果二分图最大匹配不到$n$,则无解.否则构造字典序最小的解,可以枚举每一位放什么数字,然 ...
- html5一些容易忽略的细节
最近由于经常写前端,所以系统性的看了一下html5页面的基础信息,虽然以前写了很久的html代码,但是其中的一些细节还是容易被忽略,所以这里一起整理一下. 在html5中,空元素结尾处的空格和斜杠是可 ...
- scrapy抓取拉勾网职位信息(六)——反爬应对(随机UA,随机代理)
上篇已经对数据进行了清洗,本篇对反爬虫做一些应对措施,主要包括随机UserAgent.随机代理. 一.随机UA 分析:构建随机UA可以采用以下两种方法 我们可以选择很多UserAgent,形成一个列表 ...
- 抓包分析LVS-NAT中出现的SYN_RECV
CIP:192.168.10.193 VIP:192.168.10.152:8000 DIP:100.10.8.152:8000 RIP:100.10.8.101:8000 和 100.10.8.10 ...
- Arduino可穿戴教程之第一个程序——连接硬件选择板子(二)
Arduino可穿戴教程之第一个程序——连接硬件选择板子(二) 2.4.2 连接硬件 在选择好示例程序后就可以将LilyPad通过LilyPad编程器连接到电脑了. 2.4.3 选择板子 如果你了 ...
- 基于python中staticmethod和classmethod的区别(详解)
例子 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 class A(object): def foo(self,x): print "executing foo ...
- HDU 6166 Spfa
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6166 题意:给出一个n个点的有向图.然后给你k个点,求这k个点任意两点之间的最短路的最小值.思路: 以 ...
- [CODE FESTIVAL 2016]Problem on Tree
题意:给一棵树,对于一个满足以下要求的序列$v_{1\cdots m}$,求最大的$m$ 对$\forall1\leq i\lt m$,路径$(v_i,v_{i+1})$不包含$v$中除了$v_i,v ...