一、前期问题
我想要实现类似微信底部标签的切换功能(如下图),在之前没接触fragment的时候,第一的想法是在activity之间互相跳转,但是这样不仅会使底部标签这一部分的代码重复,而且增加开销,所以在这里使用fragment是很合适的。
二、fragment和Activity的关系
fragment代表activity工作,他的状态应该反映activity的状态。fragment的生命周期是由activity托管而不是操作系统调用。 fragment的完整生命周期如下: onAttach→onCreate→onCreateView→onStart→onResume(可见状态) →onPause→onStop→onDestory→onDetach
三、fragment的使用
在activity的布局文件中为fragment安排位置(activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_frag" <!--命名为了fragment能够找到其布局-->
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
</RelativeLayout>
新建fragment的布局xml文件(fragment_test.xml)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/hello_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:text="hello_world"/>
</RelativeLayout>
创建Fragment类,加载Fragment布局(testFragment.java)
public class testFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_test, container,
false);
return view;
}
}
将fragment添加到activity中
public class FrontPage extends FragmentActivity {
private Fragment fragment;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_front);
FragmentManager fm = getSupportFragmentManager();
fragment = fm.findFragmentById(R.id.activity_frag);
fm.beginTransaction().
add(R.id.page_content, firstPage).
commit();
}
四、fragment的切换方法(介绍两种)
1、此方法原fragment依旧会保持resume状态 fragmentManager.beginTransaction().hide(fragment1).show(fragment2).commit();
2、 此方法下原fragment会被销毁
Fragment fragment = new Fragment2();
//获取Fragment事务实例
FragmentTransaction transaction = getFragmentManager().beginTransaction();
//用
replace方式替换,
transaction.replace(R.id.page_content,fragment);
五、例子
git例子链接
小结
参考《android编程权威指南》以及自己在实际运用时的感悟写下此记录,如有错误欢迎指正