抽取的控制Fragment的父Activity


/**
 * 抽象一个Activity托管我们的Single Fragment
 */
public abstract class SingleFragmentActivity extends Activity {
    protected abstract Fragment createFragment();
    @Override
    protected 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" >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我是一个TextView,我下面是一个用于填充Fragment的布局"
        android:textColor="#f00"
        android:textSize="12sp" />
    <FrameLayout
        android: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;
    @Override
    protected 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;
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setListAdapter(mAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, mTitles));
    }
    @Override
    public 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;
    @Override
    protected 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;
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle bundle = getArguments();
        if (bundle != null) {
            mArgument = bundle.getString(ARGUMENT);
        }
    }

    @Override
    public 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);//单位为sp
        tv.setGravity(Gravity.CENTER);
        tv.setBackgroundColor(0xccffff00);
        //两个Fragment在同一个Activity中,在一个Fragment中启动另一个Fragment
        tv.setOnClickListener(new OnClickListener() {
            @Override
            public 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";
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("请选择评价 :").setItems(mEvaluteVals, new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                setResult(which);
            }
        });
        return builder.create();
    }
    // 设置返回数据,这是一个自定义的方法,而不是重写的方法
    protected void setResult(int which) {
        // 判断是否设置了targetFragment
        if (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 创建 传递参数 跳转 典例的更多相关文章

  1. Fragment 创建 传递参数 跳转【典例】

    Fragment一定要有一个无参的构造方法! 因为当Activity因屏幕旋转或者因内存不足被系统杀死时,会导致Activity被重新创建,而当Activity被重建时,FragmentManager ...

  2. Android——软键盘操作+fragment之间传递参数+TextView限制字数,显示"..."

    原文地址: Android 手动显示和隐藏软键盘 Android隐藏输入法键盘(hideSoftInputFromInputMethod没有效果) Android Fragment传递参数_Fragm ...

  3. Python Unittest根据不同测试环境跳过用例详解

    虽然现在用的Katalon,不过这篇Unittest基本的用法讲的还是不错的 转自:https://mp.weixin.qq.com/s/ZcrjOrJ1m-hAj3gXK9TjzQ 本文章会讲述以下 ...

  4. Fragment 回退栈 传递参数,点击切换图片使用Fragment ListView

    Fragment回退栈  类似与Android系统为Activity维护一个任务栈,我们也可以通过Activity维护一个回退栈来保存每次Fragment事务发生的变化. 如果你将Fragment任务 ...

  5. Android解惑 - 为什么要用Fragment.setArguments(Bundle bundle)来传递参数(转)

    Fragment在Android3.0开始提供,并且在兼容包中也提供了Fragment特性的支持.Fragment的推出让我们编写和管理用户界面更快捷更方便了.   但当我们实例化自定义Fragmen ...

  6. android fragment传递参数_fragment之间传值的两种方法

    在Activity中加载Fragment的时候.有时候要使用多个Fragment切换.并传值到另外一个Fragment.也就是说两个Fragment之间进行参数的传递.查了很多资料.找到两种方法.一种 ...

  7. [Xcode 实际操作]九、实用进阶-(24)使用Segue(页面的跳转连接)进行页面跳转并传递参数

    目录:[Swift]Xcode实际操作 本文将演示使用Segue(页面的跳转连接)进行页面跳转并传递参数. 参照结合:[Xcode10 实际操作]九.实用进阶-(23)多个Storyboard故事板中 ...

  8. 如何向一个Fragment传递参数---setArguments方法的介绍

    在我们平常开发中经常会用到Fragment,当我们使用Fragment时一般是通过new Fragment的构造方法来实现,如果我问你怎么向一个Fragment传递参数,你是不是会首先想到通过构造方法 ...

  9. js跳转传递参数

    额,利用j获取了GridView中选中行数据后,通过JavaScript做跳转,传递参数的时候发现,当参数有中文的时候就会乱码, 当然出现这种情况的时候就需要对跳转的url进行编码 var urlX ...

随机推荐

  1. 【BZOJ1010】玩具装箱

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

  2. Python新手学习基础之数据结构-列表2 添加

    insert 除了使用索引,我们还可以用列表的insert方法,在列表的指定位置添加新的值. insert的用法: list.insert(index, item) 例如: like_animals ...

  3. asp.net请求流程

    http://developer.51cto.com/art/200902/109441.htm http://www.cnblogs.com/couhujia/archive/2010/04/21/ ...

  4. 脚本两则--用于快速部署HADOOP,SPARK这些(特别是VM虚拟机模板部署出来的)。。

    感觉可能只是适合我自己的部署习惯吧,且只针对CENTOS6及以下版本,以后有时间,可能还是要改进.. 1,从VM的模块产生的虚拟机,如何快速搞定网络配置? #!/bin/bash #usage:./i ...

  5. SCALA常规练习B

    package com.hengheng.scala class Point(val x : Int, val y : Int) { val isOriginal : Boolean = { x == ...

  6. filter高级应用

    Filter高级应用: Decorator模式  1)包装类需要和被包装对象 实现相同接口,或者继承相同父类 2)包装类需要持有 被包装对象的引用   在包装类中定义成员变量,通过包装类构造方法,传入 ...

  7. Niagara解决设备连接应用的软件框架平台技术。

    Niagara 是Tridium公司所研发的设计用于解决设备连接应用的软件框架平台技术. Niagara是一种应用框架,或者说是软件框架,特别设计用于应对智能设备所带来的各种挑战,包括设备连接到企业级 ...

  8. -_-#【Canvas】measureText, translate, drawImage

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. 199bit总结的影响最大的十个算法

    1. 归并排序(MERGE SORT).快速排序(QUICK SORT)和堆积排序(HEAP SORT) 哪个排序算法效率最高?这要看情况.这也就是我把3种算法放在一起讲的原因,可能你更常用其中一种, ...

  10. (2015年郑州轻工业学院ACM校赛题) C 数列

    在我们做完B题之后就去看C题了, 发现很多人都已经做出来了, 并且一血还是我们学弟拿的, 感觉这题不难, 我们举了几个例子之后发现全是Alice 然后我们就决定意淫一下,试试看! 没想到就A了 - . ...