文章目录
Fragment作为Android页面中的一种“片段”提高了页面View操控的灵活性和统一性。本文将介绍如何操控Fragment,使之满足我们对页面的不同变化需求。主要包括:添加Fragment、移除Fragment、替换Fragment、查找Fragment、隐藏Fragment、显示Fragment、Attach/Detach Fragment等内容。
1. 添加Fragment
主要方法
// 1.准备FragmentManager 和 FragmentTransaction
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 2.创建Fragment
FragmentA fragmentA = new FragmentA();
// 3.添加Fragment (不要忘记最后的commit)
fragmentTransaction.add(R.id.fragment_container1, fragmentA).commit();
// 或者:fragmentTransaction.add(R.id.fragment_container1, FragmentA.class, null).commit();
代码示例
首先,准备一个Fragment类
// 导包省略。。。
public class FragmentA extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_a, container, false);
}
}
然后,将它添加到Activity里
// 导包省略。。。
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
// 1.准备FragmentManager 和 FragmentTransaction
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 2.创建Fragment
FragmentA fragmentA = new FragmentA();
// 3.添加Fragment (不要忘记最后的commit)
fragmentTransaction.add(R.id.fragment_container1, fragmentA).commit();
}
}
这里还有一种添加Fragment的方式,前面的文章里也介绍过,此处也列举出来吧。
// 导包省略。。。
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
// 1.准备FragmentManager 和 FragmentTransaction
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 2. 添加Fragment, (第二个参数:Fragment的Class类型,意味着Fragment的创建方式是使用的默认构造函数;第三个参数为Bundle类型,向Fragment传递参数)
fragmentTransaction.add(R.id.fragment_container1, FragmentA.class, null).commit();
}
}
2. 查找Fragment
主要方法
fragmentManager.findFragmentById(R.id.fragment_container);
fragmentManager.findFragmentByTag("fragmentTag");
代码示例
// Fragment类和上面例子一样,先添加Fragment,此处省略,然后用下面方式查找
// 导包省略。。。
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
// 1.准备 FragmentManager
FragmentManager fragmentManager = getSupportFragmentManager();
// 2.使用 FragmentManager 查找 fragment容器最上面的一个Fragment
Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);
// 或者 根据Tag找Fragment
Fragment fragment2 = fragmentManager.findFragmentByTag("fragmentTag");
}
}
3. 移除Fragment
删除Fragment的前提是要先找到该Fragment,才能知道要删除的是哪一个Fragment。
主要方法
Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);
fragmentTransaction.remove(fragment).commit();
代码示例
// Fragment类和上面例子一样,先添加fragment,然后用下面代码进行移除操作
// 导包省略。。。
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
// 1.准备FragmentManager 和 FragmentTransaction
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 2.使用 FragmentManager 查找 要移除的fragment
Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);
// 3.移除目标Fragment
fragmentTransaction.remove(fragment).commit();
}
}
4. 替换Fragment
将当前Fragment容器上的Fragment替换为新的Fragment。其实,也是添加Fragment的一种方式,只不过添加之前把已有的Fragment先移除。
主要方法
fragmentTransaction.replace(R.id.fragment_container1, fragmentA).commit();
// 或者fragmentTransaction.replace(R.id.fragment_container1, FragmentA.class, null).commit();
代码示例
// Fragment类和上面例子一样
// 导包省略。。。
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
// 1.准备FragmentManager 和 FragmentTransaction
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 2.创建Fragment
FragmentA fragmentA = new FragmentA();
// 3.将当前Fragment容器上的Fragment替换为新的Fragment (不要忘记最后的commit)
fragmentTransaction.replace(R.id.fragment_container1, fragmentA).commit();
// 或者 fragmentTransaction.replace(R.id.fragment_container1, FragmentA.class, null).commit();
}
}
5. 隐藏/显示Fragment
Fragment作为控件的集合体,可以方便对多个控件统一管理,也就是统一显示/隐藏。该过程,Framgent生命周期没有变化。
等价于对View设置View.INVISIBLE
主要方法
fragmentTransaction.hide(fragment).commit();
fragmentTransaction.show(fragment).commit();
代码示例
// Fragment类和上面例子一样,先添加fragment,然后用下面代码进行操作
// 导包省略。。。
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
// 1.准备FragmentManager 和 FragmentTransaction
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 2.使用 FragmentManager 查找要隐藏的fragment
Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);
// 3.隐藏目标Fragment,等价于 findViewById(R.id.fragment_container).setVisibility(View.INVISIBLE);
fragmentTransaction.hide(fragment).commit();
// 4.显示目标Fragment,等价于 findViewById(R.id.fragment_container).setVisibility(View.VISIBLE);
// fragmentTransaction.show(fragment).commit();
}
}
6. Attach/Detach Fragment
使界面上一个Fragment消失除了移除、隐藏,还有Detach。
Detach,翻译为“分离,解除”,这里就是将Fragment上的View从Container移除,然后View销毁。
该Fragment将执行生命周期方法:—onPause-----onStop----onDestroyView-----,但并不会继续执行onDestory,也就是Fragment没有完全销毁。
对应的,Attach,翻译为“绑定,附上”,这里就是将刚才detach的Fragment,重新再attach上,是一个相反的过程,伴随着View的重新创建。这个过程该Fragment将执行生命周期方法:—onCreateView-----onViewCreated----onActivityCreated----onStart-----onResume—
主要方法
fragmentTransaction.attach(fragment).commit();
fragmentTransaction.detach(fragment).commit();
代码示例
// Fragment类和上面例子一样,先添加fragment,然后用下面代码进行操作
// 导包省略。。。
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
// 1.准备FragmentManager 和 FragmentTransaction
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 2.使用 FragmentManager 查找 要detach的fragment
Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);
// 3.detach目标Fragment
fragmentTransaction.detach(fragment).commit();
// 4.attach目标Fragment
// fragmentTransaction.attach(fragment).commit();
}
}