第六篇 Fragments应用

来源:互联网 发布:mysql 用户密码破解 编辑:程序博客网 时间:2024/06/12 18:59

见:https://developer.android.com/training/basics/fragments/index.html
一个最简单的例子:

xml代码:


activity_main.xml

<LinearLayout 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:orientation="vertical" >
<!--

给一个Activity添加一个Fragment,Activity布局文件中声明Fragment

-->
    <fragment
        android:id="@+id/article_fragment"
        android:name="com.example.fragment.ArtcleFragment"
        android:layout_width="match_parent"
        android:layout_height="200dp" />

</LinearLayout>

article_view.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/article"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:text="@string/app_name"
    android:textSize="18sp" />

在系统创建这个Activity布局的时候,他会实例化每个布局中的每个fragment,调用每个fragment的onCreateView()方法来取回每个fragment的视图.系统把fragment返回的视图直接插入到<fragment>标签所在的地方。
Java代码:

MainActivity.java

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}


ArtcleFragment.java

public class ArtcleFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        
        return inflater.inflate(R.layout.article_view, container, false);//为了从onCreateView()方法返回一个布局,你可以用一个xml布局文件来填充它
    }

}

至于AndroidManifest.xml文件,就启动的Activity就可以了。
更深的方法,查看API

一个Fragment经常被用作activity界面的一部分,为activity贡献自己的界面,为了给fragment提供一个布局,你必须实现onCreateView()方法,为了从onCreateView()方法返回一个布局,你可以用一个xml布局文件来填充它。

当你增加一个Fragment来作为Activity界面布局的一部分时,他存在在Activity视图层里面的一个ViewGroup中,这个Fragment定义了自己的视图.你可以通过在Activity的布局文件中用<fragment>声明这个fragment来把这个fragment插入你的activity中,或者你可以在应用的代码中把他添加添加到一个现存的ViewGroup中.然而,Fragment不必是一个activity布局的一部分,你可以使用一个Fragment而不实用他的UI,这样可以让Fragment作为Activity的一个不可见部分来工作.

上面采用的是前者。

下面说说后者,即不使用<fragment>标签添加Fragment到Activity。

在任何你Activity运行的时候,你都可以把fragment添加到Activity的视图中.你只需要指定一个用于盛放Fragment的ViewGroup.为了让fragment可以被管理(比如添加,删除,替换fragment),你必须使用来自FragmentTransaction的API.你可以像下面这样在Activity中获取一个FragmentTransaction的实例:

FragmentManager fragmentManager = getFragmentManager()FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

你可以使用Add()方法添加一个Fragment,指定要添加的Fragment和目标View,如下:

ExampleFragment fragment = new ExampleFragment();fragmentTransaction.add(R.id.fragment_container, fragment);fragmentTransaction.commit();

add()方法中的第一个参数是Fragment所要放置的目标ViewGroup,通过资源ID指定,第二个参数是要添加的Fragment.只要你使用FragmentTransaction做了修改,你必须调用commit()方法来使修改生效.

方法:

onCreate()创建fragment的时候,系统会调用这个方法.在你实现过程中,当fragment暂停(pause),停止(stop)然后恢复(resume)时,你应该初始化你想要保持的,fragment的必要的组件.

onCreateView()在fragment第一次绘制他的用户界面的时候系统会调用这个方法.如果你想为你的fragment绘制界面,你必须从这个方法中返回一个View,这个View是你fragment布局的基础.如果这个Fragment不提供UI,你可以返回空.

onPause()系统调用这个方法作为用户离开这个fragment的第一标志(虽然这不总是意味着这个Fragment被摧毁了).通常是你需要做一些改变,这些改变超出了当前的用户会话(因为用户有可能不会回到这个界面来).


DialogFragment:显示一个浮动的对话框.使用这个类来创建一个对话框是和使用对话Helper方法在Activity类中创建对话框都是很好的方法,因为你可以把Fragment对话框包含在activity管理的Fragment返回栈中,允许用户返回到关闭的Fragment中.

ListFragment:展示一列被adapter(比如SimpleCursorAdapter)管理的项,和ListActivity很相似.它提供了一些管理一个列表视图的方法,比如处理点击事件的onListItemClick()方法.

PreferenceFragment:用一个列表来显示一组偏好设置对象,类似于PreferenceActivity. 在创建设置型的activity时会用到.


为了管理你Activity中的fragment,你需要使用FragmentManager.你可以通过你Activity中的getFragmentManager()来获取它,你可以这样操作:

使用findFragmentById()(提供UI的Fragment)或者findFragmentByTag()(没有提供UI的Fragment) 获取你Activity存在的Fragment;

使用popBackStack()把Fragment从返回栈中弹出(模拟用户的返回命令);

使用addOnBackStackChangedListener()方法为返回栈的变化注册监听器等,更多请见FragmentManager API。

执行Fragment事务

在你的Activity中使用Fragment的最大好处就是可以针对用户的操作,进行对Fragment的添加,移除,替换等等其他操作.你提交给Activity的每个变化称为一个事务,这些事务你可以使用FragmenTransaction的API来实现.你也可以在Activity管理的返回栈中保存每个事务,使用户可以在Fragmen的变化后返回之前的状态(类似于在Activity跳转后的返回).

取得一个FragmentTransaction的实例:

FragmentManager fragmentManager = getFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
每个事务是一系列你想要同时执行的Fragmen的变化.你可以使用像add(),remove(),replace()这样的方法来为一个事务设定你想要执行的操作.为了使Activity的事务生效,你必须执行commit()方法.

在你调用commit()方法的之前,为了添加这个事务到一个Fragmen事务的返回栈,你可能想要调用addToBackStack()方法.这个返回栈被Activity管理,允许用户通过按下返回按键返回之前的Fragmen状态.

操作代码段:

// Create new fragment and transaction//创建一个新的Fragmen和事务Fragment newFragment = new ExampleFragment();FragmentTransaction transaction = getFragmentManager().beginTransaction()// Replace whatever is in the fragment_container view with this fragment,//使用这个Fragment替换在Fragmen容器中的Fragmet// and add the transaction to the back stack//添加这个事务到返回栈transaction.replace(R.id.fragment_container, newFragment);//新的Fragmen替换了R.id.fragment_container ID指定的布局容器中当前存在的fragment(如果存在的话)transaction.addToBackStack(null);//通过调用addToBackStack()方法,替换事务被保存在了返回栈中,这样用户可以回退这个事务,通过按下返回键返回到以前的fragment. // Commit the transaction//提交这个事务.transaction.commit();如果你在事务中添加了多个变化(比如另一个add()方法或者remove()方法),然后调用了addToBackStack()方法,那在你调用commit()方法之前的所有变化都会作为单独的事务被添加到返回栈中,返回键将会把他们全部回退.同一个容器添加多个fragment,那么你添加的顺序决定了他们在视图层出现的顺序,还有就commit必须最后提交。

特别的,fragment可以通过getActivity()方法来访问Activity实例并可以轻易的执行像在activity视图中查找View的任务.

View listView = getActivity().findViewById(R.id.list);

同样的,使用findFragmentById()或findFragmentByTag()通过从FragmentManager获取一个对这个Fragment的引用,你的Activity可以调用fragment中的方法

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);




原创粉丝点击