您的位置:首页 > 其它

Fragment的用法(1)

2016-03-11 15:11 232 查看
Fragment是一种可以嵌入活动界面中的UI片段,它与Activity十分相似,能够包含布局,也有自己的生命周期。

在Android中,当我们想要进行界面变化时,许多人的做法都是建立几个Activity,然后在需要的时候再利用Intent进行跳转,这样当然可以。不过Activity是比较重量级的资源,进行界面消耗资源相对较大,其实我们也可以利用Fragment简便地进行界面变化。

接下来我们就来学习如何使用Fragment。

新建一个android工程,将之命名为FragmentTest。修改默认的activity_main.xml文件,代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.fragmenttest.MainActivity" >
</LinearLayout>


可以看到,布局文件中不包含任何组件,而我们的想法就是向当前的空白界面嵌入一个Fragment。

在layout文件夹下新建一个fragment_first.xml布局文件,作为我们要嵌入的Fragment的布局资源。布局文件中包含一个TextView和一个Button,TextView用于提示当前为哪个Fragment,Button用于切换Fragment。

<?xml version="1.0" encoding="utf-8"?>
<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="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="这是第一个Fragment"
android:textSize="20dp" />
<Button
android:id="@+id/showAnotherFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="跳转到另一个Fragment"
android:textSize="20dp" />
</LinearLayout>


然后,再新建一个FragmentFirst类继承Fragment,重写onCreateView方法。可以看到,onCreateView方法首先动态加载了布局文件。而如果希望当前Fragment能够切换为FragmentAnother,则在按钮点击事件中,依次执行了以下方法:

- 利用getFragmentManager().beginTransaction()开启了事务

- 利用replace(R.id.main_layout, new FragmentAnother())替换Fragment

- 利用addToBackStack(null)将Fragment加入回退栈中

- 利用commit()提交事务

public class FragmentFirst extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//动态加载布局文件
View view = inflater.inflate(R.layout.fragment_first, container, false);
Button button = (Button) view.findViewById(R.id.showAnotherFragment);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
getFragmentManager().beginTransaction().replace(R.id.main_layout, new FragmentAnother())
.addToBackStack(null).commit();
}
});
return view;
}

}


在layout文件夹下再新建一个fragment_another.xml文件,当中的Button用于回退到第一个Fragment

<?xml version="1.0" encoding="utf-8"?>
<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="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="这是另一个Fragment"
android:textSize="20dp" />

<Button
android:id="@+id/backBut"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="回退到第一个Fragment"
android:textSize="20dp" />

</LinearLayout>


再新建一个FragmentAnother类继承Fragment,使用方法类似于FragmentFirst。不过,在按钮点击事件中,调用的方法实现的是Fragment栈的回退。

public class FragmentAnother extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_another, container, false);
Button button = (Button) view.findViewById(R.id.backBut);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
getFragmentManager().popBackStack();
}
});
return view;
}
}


代码编写到这里,其实我们还没有向Activity添加Fragment。此时运行程序的话界面还是一片空白。

修改MainActivity类,在onCreate方法中向Actvity添加一个FragmentFirst实例。这样,我们就大功告成了。

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction().add(R.id.main_layout, new FragmentFirst()).commit();
}
}

}


运行程序,初始界面如下:



可以看到,MainActivity加载的布局文件中并没有包含任何组件,显示出来的组件却有两个,这就是因为FragmentFirst嵌入到了当前的Activity当中。

点击按钮,界面如下:



可以发现界面切换为了第二个Fragment,即FragmentAnother。这时,点击按钮或者按返回键,都可以回退到第一个Fragment。这是因为在FragmentFirst 类中替换Fragment时调用了addToBackStack(null)方法。如何去掉该方法,按返回键则将直接退出程序。

项目代码的下载地址:Fragment的用法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: