Android — 如何创建和修改 fragment 及相关注意事项
来源:互联网 发布:国内网络婚纱品牌排行 编辑:程序博客网 时间:2024/06/06 17:09
如何创建 fragment activity
public class FooFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 为fragment提供xml布局文件 return inflater.inflate(R.layout.fragment_foo, container, false); }}
如何在代码中使用 fragment
在代码中实现 fragment 一般有两种方法,分别为静态实现和动态实现。
1. 在 xml 中确定 fragment 内容
在 xml 通过 android:name 参数来确定 fragment 要显示的内容,这种方法建立的 fragment 不可以在程序运行过程中移除,示例代码如下:
<fragment android:name="com.fragment.FooFragment" tools:layout="@layout/fragment_foo" android:id="@+id/fragment" android:layout_width="match_parent" android:layout_height="wrap_content" />
其中的 com.fragment.FooFragment 为名为 FooFragment 的 Fragment Activity。
2. 在程序运行时确定 fragment 内容
首先,在 xml 布局文件中应该放置 FragmentLayout 作为 fragment 的容器,代码如下:
<FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/fragment_container"></FrameLayout>
在声明了 android:id 之后,在 Java 代码中就可以操作这个 fragment 容器了。可以使用add()
, replace()
, remove()
等方法,示例代码如下:
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();fragmentTransaction.remove(R.id.fragment_container, new FooFragment());fragmentTransaction.commit();
3. add() 方法和 replace() 方法说明 add()
方法是在原有的基础上添加一个 fragment,实现叠加的效果。 replace()
方法是将原先所有的 fragment 移除,然后添加一个 fragment。
关于 fragment 的注意事项
1. 如何理解 addToBackStack() 方法
fragmentTransaction.replace(R.id.fragment_container, new BarFragment());fragmentTransaction.addToBackStack(null);fragmentTransaction.commit();
在代码中,我们可以看到,addToBackStack() 方法作用的对象是一个 transaction。也就是说,在执行这个 transaction 时,系统会建立一个回退栈,其中记录的是进行 transaction 前后 fragment 的内容。当手机上的 back 键按下时,最后建立的回退栈先进行响应,使得当前 fragment 先 remove 进行 transaction 后 fragment 的内容,再 add 上进行 transaction 前 fragment 的内容。
来一个实例,假设当前 fragment 内容为 C,先进行了一次有 addToBackStack 的replace(container, A)
,再进行一次无 addToBackStack 的replace(container, B)
时,如果触发了 back 事件,那么之前建立的回退栈响应,使 fragment 先 remove 掉 A,事实上本来就已经没了有,然后 add 上原先状态的C。此时,B是不会被 remove 掉的。所以,最后 fragment 中的内容为 B 和 C 两者的叠加。
如果希望清空 fragment 的回退栈,可以采用在 replace 前加上 popBackStack()
方法,第二个参数为POP_BACK_STACK_INCLUSIVE。示例代码如下:
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();fragmentTransaction.replace(R.id.fragment_container, new FooFragment());fragmentTransaction.commit();
2. 关于 fragmentTransaction 的延迟问题
fragmentTransaction.commit()
并不是立即执行的,也并非进入UI线程队列中等待顺序执行,而是由系统自动调配,在 UI 线程空闲时执行。这样就会产生一个问题,如果我需要获取到 fragment 中对象的实例,这个时候findViewById()
方法会返回 null ,那么如何解决这个问题呢?
第一种方法是通过getSupportFragmentManager().executePendingTransactions()
来让 transaction 立即加入UI线程执行,而不是被调配在空闲时间执行。但是如果是在其他线程中获取view,这个方法依然行不通,因为有可能UI线程本身正在进行一个相对耗时的操作,而第二种方法则更为安全。
第二种方法是在 fragment activity 的onCreateView()
方法中获取对应的view,示例代码如下:
@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_bar, container, false); textView = (TextView)rootView.findViewById(R.id.textbar); return rootView;}
fragment lifecycle 流程图
references:
- Building a Dynamic UI with Fragments
- Building a Flexible UI
- Fragments API Guides
- Android — 如何创建和修改 fragment 及相关注意事项
- fragment 创建菜单注意事项
- 【Android】创建和使用fragment
- [android 创建Fragment示例传递参数时的注意事项]
- android工程修改包名及注意事项
- Android Fragment——创建Fragment
- Android Fragment---创建Fragment
- Android Fragment---创建Fragment
- Android Fragment使用注意事项
- Android中fragment注意事项
- 谈谈Fragment的构造函数、重新创建(recreate)及相关
- Fragment简介及使用注意事项
- JAVA Eclipse创建Android程序如何实现MainActivity和Fragment相互传递数据
- oracle 创建表和插入的相关注意事项
- VS项目创建和Dll相关项目的注意事项
- Android Fragment中载入Fragment时注意事项
- 如何在对话框中创建View及注意事项
- Android—广播(Broadcast)—广播的注意事项及相关问题分析
- elasticsearch 2.3.4 java API 连接,ik分词器,设置集群节点,创建index,mapping的几种方式
- LeetCode-208.Implement Trie (Prefix Tree)
- 机器学习实战1:朴素贝叶斯模型:文本分类+垃圾邮件分类
- Looper Handler MessageQueue Message 探究
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- Android — 如何创建和修改 fragment 及相关注意事项
- Android Activity各启动模式的差异
- Swift基础(十)协议的委托代理
- 机器学习实战2:关联规则:议会投票+毒蘑菇
- [hihoCoder太阁最新面经算法竞赛8]B.Dice Possibility
- Android Service
- mappingResources、mappingLocations、mappingDirectoryLocations、mappingJarLocations
- 字符串-10010 Where’s Waldorf
- 最值求解,活动安排,部分背包问题