Fragment 创建 传递参数 跳转 典例
抽取的控制Fragment的父Activity
/*** 抽象一个Activity托管我们的Single Fragment*/public abstract class SingleFragmentActivity extends Activity {protected abstract Fragment createFragment();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_single_fragment);FragmentManager fm = getFragmentManager();Fragment fragment = fm.findFragmentById(R.id.id_fragment_container);if (savedInstanceState==nul) {//核心代码//注意不是判断Fragment是否为空,而是判断Bundle是否为空!为什么需要判断Bundle是否为null呢?//当【Activity】因为配置发生改变(如屏幕旋转)或者因内存不足被系统杀死,造成被重新创建时,我们的【fragment】会被保存下来(这个基本和onCreate中的参数Bundle的原理一致)//虽然会创建新的【fm】,但是新的fm会首先会去获取保存下来的fragment队列,并重建fragment队列,从而可以恢复之前的状态。如果不判断,则会导致界面上出现两个重叠的Fragment。fragment = createFragment();//add方法中id的作用:1、告知fm此fragment的位置;2、设置后我们可以通过findFragmentById找到它fm.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="我是一个TextView,我下面是一个用于填充Fragment的布局"android:textColor="#f00"android:textSize="12sp" /><FrameLayoutandroid:id="@+id/id_fragment_container"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>
MainActivity
![]()
public class ListTitleActivity extends SingleFragmentActivity {
private ListTitleFragment mListFragment;@Overrideprotected Fragment createFragment() {mListFragment = new ListTitleFragment();return mListFragment;}}
MainActivity中的Fragment-标题列表
public class ListTitleFragment extends 0{/**结果码*/public static final int REQUEST_DETAIL = 0x110;private List<String> mTitles = Arrays.asList("Hello", "World", "Android");private int mCurrentPos;private ArrayAdapter<String> mAdapter;@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(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;Intent intent = new Intent(getActivity(), ContentActivity.class);intent.putExtra(ContentFragment.ARGUMENT, mTitles.get(position));startActivityForResult(intent, REQUEST_DETAIL);//在Fragment中启动Activity}@Override//获取由此Fragment启动的另一个Activity中的一个ContentFragment结束时,ContentFragment返回的数据//注意:这里的ContentFragment中的数据又是由另一个EvaluateDialog结束时返回的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 (responseEvaluate == null || responseEvaluate == "") responseEvaluate = "请评价";mTitles.set(mCurrentPos, mTitles.get(mCurrentPos) + " -- " + responseEvaluate);mAdapter.notifyDataSetChanged();} else Toast.makeText(getActivity(), "你还没有评价哦~", Toast.LENGTH_SHORT).show();}}
第二个Activity
![]()
public class ContentActivity extends SingleFragmentActivity {
private ContentFragment mContentFragment;@Overrideprotected Fragment createFragment() {String title = getIntent().getStringExtra(ContentFragment.ARGUMENT);mContentFragment = ContentFragment.newInstance(title);return mContentFragment;}}
第二个Activity中的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;/**构造时把传入的参数带进来*/public static ContentFragment newInstance(String argument) {Bundle bundle = new Bundle();bundle.putString(ARGUMENT, argument);ContentFragment contentFragment = new ContentFragment();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());ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);tv.setLayoutParams(params);tv.setText(mArgument);tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 30);//单位为sptv.setGravity(Gravity.CENTER);tv.setBackgroundColor(0xccffff00);//两个Fragment在同一个Activity中,在一个Fragment中启动另一个Fragmenttv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {EvaluateDialog dialog = new EvaluateDialog();//注意设置setTargetFragment,参数表示【此dialog中的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) {//根据返回数据的Fragment返回的数据中的Tag,获取返回数据中我们需要的值String evaluate = data.getStringExtra(EvaluateDialog.RESPONSE_EVALUATE);Toast.makeText(getActivity(), "你的评价为:" + evaluate, Toast.LENGTH_SHORT).show();//将获取到的结果返回(这个Fragment相当于一个中转站,好麻烦,建议直接用Eventbus)Intent intent = new Intent();intent.putExtra(RESPONSE, evaluate);getActivity().setResult(ListTitleFragment.REQUEST_DETAIL, intent);//第一个参数代表结果码,在启动者中定义}}}
第三个Fragment--是一个dialog
/**这是在同一个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("请选择评价 :").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被重新创建,而当Activity被重建时,FragmentManager ...
- 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 ...
随机推荐
- Spring4.0学习笔记(6) —— 通过工厂方法配置Bean
1.静态工厂方法: bean package com.spring.factory; public class Car { public Car(String brand) { this.brand ...
- eclipse中如何导入jar包
如图,首先右键点击项目,选择最下面的properties, 然后进去之后点击java build path,右边会出来4个选项卡,选择libraries, 这时候最右边会有多个选项,第一个add ja ...
- jquery实现DIV层拖动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- C# windows窗体程序打包安装及卸载
一.新建安装部署项目
- Linux bash重拾 2016-8-16
bash支持的引号: "" 双引号:弱引用,可以实现变量替换(变量会替换为值) [root@localhost ssh-6Xolw4LLAMwe]# echo "dire ...
- Scut:SocketListener 的解析
大致浏览了一遍,Scut 的网络模型采用的是 SAEA 模型, 它是 .NET Framework 3.5 开始支持的一种支持高性能 Socket 通信的实现. 通过分析 Scut 的套接字监听控制, ...
- 使用cglib动态创建java类
转至:http://ckwang17.iteye.com/blog/963881 cglib 是一个开源项目! 是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Jav ...
- 萬用表檢測MOS管好壞的簡便方法
在開發LED驅動電源時難免不會接觸到MOS管,它又是一個相當脆弱的器件.往往有時故障就是因為它罷工了.以下的一點經驗希望對大家有所幫助. 1.用黑表筆接在D極上 ,紅表筆接在S極上 , 一般有一個5 ...
- 多备份CEO胡茂华:创业路上的五道坎
本文由多备份CEO胡茂华记述,授权南七道发表,未做删改.胡茂华:腾讯第116号员工,历任腾讯总监.盛大CTO (旅游).1号店技术副总裁.现担任云服务提供商多备份联合创始人&CEO. 2014 ...
- POJ2240 Arbitrage(最短路)
题目链接. 题意: 根据汇率可以将一种金币换成其他的金币,求最后能否赚到比原来更多的金币. 分析: 最短路的求法,用floyd. #include <iostream> #include ...
public class ListTitleActivity extends SingleFragmentActivity {
public class ContentActivity extends SingleFragmentActivity {