zoukankan      html  css  js  c++  java
  • 【转】 Pro Android学习笔记(四三):Fragment(8):再谈Transaction和管理器

    目录(?)[-]

    1. Transaction的一些操作
    2. 再谈FragmentManager
      1. 调用其他fragment的方法
      2. 唤起activity
      3. 唤起fragment和相互通信
    3. 一些其它

    Transaction的一些操作

    Transaction提供add()、hide()、show()、remove()等功能。下面我们利用这些功能通过fragment的隐藏和显示,为用户提供切换的效果。

    public void showDetails(int index){  
        if(index <0) 
            index = 0;        
        //将所有书的简介都生成fragment,通过add()加入容器中 
        FragmentTransaction ft = getFragmentManager().beginTransaction(); 
        if(details == null){  
            details = new DetailFragment[BooksInfo.TITLES.length]; 
            for(int i = 0; i < details.length; i ++){ 
                details[i]= DetailFragment.newInstance(i); 
                ft.add(R.id.details,details[i]);  //或者使用add(id, fragment, tag),同时为fragment指定tag
            } 
        }        
        //根据用户点击的书目序号,将相应的简介显示,而将其他简介隐藏。  
        for(int i = 0 ; i< details.length; i ++){ 
            if(i == index) 
                ft.show(details[i]); 
            else  
                ft.hide(details[i]); 
        }        
        //任何fragment transaction处理后,都通过commit()进行确认。 
        ft.commit(); 

    在之前的基础小例子中,使用了replace(),相当于执行了remove()和add()的操作。commit()是加入UI线程的执行操作。

    再谈FragmentManager

    FragmentManager是在activity中与fragment对象进行互操作的接口,在activity和fragment(已与activity关联attach)中可以通过getFragmentManager()获取。通过管理器,可以获得fragement transaction,根据id,tag等获取fragment。

    我们可以通过管理器的dump()功能输出debug信息。或者使用getFragmentManager().enableDebugLogging(true);来提供相关的debug功能。

    调用其他fragment的方法

    FragmentManager管理与activity相关的所有fragment。如果在fragment A中要调用到Fragment B的某个方法,可以通过管理器找到其他fragment的对象,如下处理:

    FragmentB fragOther = (FragmentB)getFragmentManager().findFragmentByTag(“b”); 
    fragOther.someMethod( … );

    唤起activity

    在fragment可以直接使用startActivity()和startActivityForResult()方法,以及回调函数onActivityResult()。

    唤起fragment和相互通信

    如果在fragment A中要唤起 fragment B,在FragmentA中处理如下:

    FragmentB bFrag  = new FragmentB(); 
    bFrag.setTargetFragment(this, 0); 
    getFragmentManager()fm.beginTransaction().add(bFrag, "work").commit();

    创建和通过transaction加入没有什么特别,关键是setTragetFragment(),这样在FragmentB中就可以获得FragmentA的对象,可调用FragmentA的方法,Fragment B的代码例子如下:

    TextView tv = (TextView)getTargetFragment().getView().findViewById(R.id.text1);
    tv.setText(“Set from the called fragment”);

    一些其它

    有时在应用中为了某种逻辑,使用没有view层级的,即不可视的fragment,用之存储一些信息,当activity或者fragment由于UI配置改变进行re-create时,提供帮助。

    在基础小例子中,学习了Fragment类以及子类ListFragment,此外还有DialogFragment,PreferenceFragment和WebViewFragment。

    本博文涉及的例子代码,可以在Pro Android学习:Fragment中下载。

    相关链接: 我的Android开发相关文章

  • 相关阅读:
    Java Swing TextArea 滚动条和获得焦点
    Windows下一个AndroidStudio 正在使用Git(AndroidStudio工程GitHub关联)
    我们将与操作系统工作谈一场无私的爱──《云情人》思考
    CSDN markdown 编辑 三 基本语法
    Android项目包装apk和apk反编译,xml反编译
    char (*(*p[3])( int ))[5] 等等一系列 左右法则
    typedef 优于 #define
    int *(*a[5])(int, char*)
    C++宏定义详解
    STL 案例分析
  • 原文地址:https://www.cnblogs.com/blongfree/p/5047983.html
Copyright © 2011-2022 走看看