Fragment碎片
Fragment的生命周期:
onAttach():onAttach()方法会在Fragment与Activity窗口关联后立刻调用。
onCreate():在调用完onAttach()执行完之后,立即就会调用onCreate()方法,可以在Bundle对象中获取一些在Activity中传过来的数据。通常会在该方法中读取保存的转态,获取或初始化一些数据。在该方法中不要进行耗时操作,不然Activity窗口不会显示。
onCreateView():在该方法中创建Fragment显示的View,其中inflater是用来装载布局文件的,container是<fragment>标签的父标签对应对象,saveInstanceState参数可以获取Fragment保存的状态,如果未保存那么就为null。
onActivityCreated():
在Activity的onCreate()方法执行完之后,Android系统会立刻调用该方法,表示Activity窗口已经初始化完成,从这一个时候开始,就可以在Fragment中使用getActivity().findViewById(R.id.xxx);来操作Activity中的view了。
onStart():当系统调用该方法的时候,fragment已经显示在UI上了,但还不能进行互动,因为onResume()方法还没有执行完。
onResume():该方法为fragment从创建到显示Android系统调用的最后一个生命周期方法,调用完该方法时候,fragment就可以与用户互动了。
onPause():fragment由活动状态变成非活跃执行的第一个回调方法,通常可以在这个方法中保存一些需要临时暂停的工作。
onStop():当onStop()返回的时候,fragment将从屏幕上消失。
onDestoryView():该方法的调用意味着在onCreateView()中创建的视图都将被移除。
onDestroy():Android在Fragment不再使用时会调用该方法,此时Activity可以获得Fragment对象,但无法对获得的Fragment进行任何操作。
onDetach():为Fragment生命周期中的最后一个方法,当该方法执行完后,Fragment与Activity不再有关联。
布局文件中添加碎片
1、在onCteate()方法中调用inflater.inflate()加载Fragment布局
用创建一个Fragment,必须先创建一个Fragment的子类,至少调用onCreate(),onCreateView(),onPause()。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.example_fragment, container, false);
}
2、在xml的<fragment>中需要显示指明碎片名称(android:name="com.exmple.fragment.LeftFragment")需要将类的包名加上。
动态添加碎片
1、创建待添加的碎片实例
2、获取FragmentManager,在活动中可以直接掉用getFragmentManager()方法得到。
3、开启一个事务,通过调用beginTransaction()方法开启。
4、向容器中加入碎片,使用replace()方法实现,需要传入容器的id和待添加碎片实例。
5、提交事务,调用commit()方法。
public void onClick(View v){
Fragment fragment = new FragmentRightFragment();
FragmentManager fargmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.right_layout,fragment);
transaction.commit();
}
返回上一个碎片
transaction.addToBackStack()
在activity中获得Fragment的实例。
getFragmentManager.findFragmentById()
调用activity中的方法
getActivity()获取activity对象。
Fragment中附加的回调方法
1、onAttach():碎片与活动建立关联时调用
2、onCreateView():碎片创建视图时调用。
3、onActiviCreated():确保与碎片关联的活动已经创建完毕时调用
4、onDestroyView():与碎片关联的视图被移除时调用
5、onDetacd():碎片与活动解除关联时调用。
在Fragment中也可以使用onSaveInstanceState()保存数据。
动态加载布局技巧
1、限定符:实现单双页模式
大小:small、normal、large、xlarge
分辨率:ldpi、mdpi、hdpi、xhdpi
方向:land、port
Fragment与Activity交互
1、将Fragment添加到activity之中
(1).在activity的布局文件里声明fragment
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"> <fragment android:name="com.example.test.FragmentOne"
android:id="@+id/fo"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
1:>用android:id属性提供一个唯一的标识
2:>用android:tag属性提供一个唯一的字符串。
3:>如果上述两种属性都没有,系统会使用其容器视图(view)的ID。
(2).通过编码将fragment添加到已存在的ViewGroup中
在activity运行的任何时候,你都可以将fragment添加到activity布局中。要管理activity中的fragment,可以使用FragmentManager。可以通过在activity中调用getFragmentManager()获得。
FragmentManager的相关方法:
2:>隐藏:remove(), hide(), detach()
FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
(3).添加没有界面的fragment
Fragment状态的持久化:
由于Activity会经常性的发生配置变化,所以依附它的Fragment就有需要将其状态保存起来问题。下面有两种常用的方法去将Fragment的状态持久化。
- 方法一
可以通过protected void onSaveInstanceState(Bundle outState),protected void onRestoreInstanceState(Bundle savedInstanceState)
状态保存和恢复的方法将状态持久化。 方法二(更为方便,让Android自动帮我们保存Fragment状态)
<1>.我们只需要将Fragment在Activity中作为一个变量整个保存,只要保存了Fragment,那么Fragment的状态就得到保存了。
FragmentManager.putFragment(Bundle bundle, String key, Fragment fragment) 是在Activity中保存Fragment的方法。
FragmentManager.getFragment(Bundle bundle, String key) 是在Activity中获取所保存的Frament的方法。
<3>.下面给出状态的持久化实例代码:
FragmentB fragmentB; @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_activity);
if( savedInstanceState != null ){
fragmentB = (FragmentB) getSupportFragmentManager()
.getFragment(savedInstanceState,"fragmentB");
}
init();
} @Override
protected void onSaveInstanceState(Bundle outState) {
if( fragmentB != null ){
getSupportFragmentManager()
.putFragment(outState,"fragmentB",fragmentB);
}
super.onSaveInstanceState(outState);
} /** Fragment中保存变量的代码 **/
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable
ViewGroup container, @Nullable Bundle savedInstanceState) {
AppLog.e("onCreateView");
if ( null != savedInstanceState ){
String savedString = savedInstanceState
.getString("string");
//得到保存下来的string
}
View root = inflater.inflate(R.layout.fragment_a,null);
return root;
} @Override
public void onSaveInstanceState(Bundle outState) {
outState.putString("string","anAngryAnt");
super.onSaveInstanceState(outState);
}
管理Fragment回退栈
跟踪回退栈的状态
我们通过实现OnBackStackChangedListener
接口来实现回退栈状态跟踪,具体代码如下:
/implements接口
public class XXX implements FragmentManager.OnBackStackChangedListener
//实现接口所要实现的方法
@Override
public void onBackStackChanged() {
//do whatevery you want
}
//设置回退栈监听接口
getSupportFragmentManager().addOnBackStackChangedListener(this);
(1).
FragmentTransaction.addToBackStack(String)
将一个刚刚添加的Fragment加入到回退栈中
(2).
getSupportFragmentManager().getBackStackEntryCount()
获取回退栈中的实体数量
(3).
getSupportFragmentManager().popBackStack(String name, int flags)
根据name立刻弹出栈顶的fragment
(4).
getSupportFragmentManager().popBackStack(int id, int flags)
根据id立刻弹出栈顶的fragment
1、Activity传递给Fragment
采用 Bundle
方式。
- 步骤1:
Activity
的布局文件
LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"> <TextView
android:id="@+id/text"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="我是Activity" /> <FrameLayout
android:layout_below="@+id/button"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="500dp"/>
</LinearLayout>
- 步骤2:设置
Fragment
的布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorAccent"
> <TextView
android:id="@+id/fragment"
android:text="我是fragment"
android:layout_gravity="center"
android:textSize="30dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/> <TextView
android:id="@+id/text"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="等待Activity发送消息" /> <Button
android:id="@+id/button"
android:layout_gravity="center"
android:text="点击接收Activity消息"
android:layout_centerInParent="true"
android:textSize="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
- 步骤3:设置
Activity
的类文件
Activity2Fragment
public class Activity2Fragment extends AppCompatActivity { TextView text; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activcity_2_fragment); text = (TextView) findViewById(R.id.text); // 步骤1:获取FragmentManager
FragmentManager fragmentManager = getFragmentManager(); // 步骤2:获取FragmentTransaction
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); // 步骤3:创建需要添加的Fragment
final mFragment fragment = new mFragment(); // 步骤4:创建Bundle对象
// 作用:存储数据,并传递到Fragment中
Bundle bundle = new Bundle(); // 步骤5:往bundle中添加数据
bundle.putString("message", "I love Google"); // 步骤6:把数据设置到Fragment中
fragment.setArguments(bundle); // 步骤7:动态添加fragment
// 即将创建的fragment添加到Activity布局文件中定义的占位符中(FrameLayout)
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit(); }
}
- 步骤4:设置
Fragment
的类文件
public class mFragment extends Fragment {
Button button;
TextView text;
Bundle bundle;
String message; @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View contentView = inflater.inflate(R.layout.fragment, container, false);
// 设置布局文件 button = (Button) contentView.findViewById(R.id.button);
text = (TextView) contentView.findViewById(R.id.text); // 步骤1:通过getArgments()获取从Activity传过来的全部值
bundle = this.getArguments(); // 步骤2:获取某一值
message = bundle.getString("message"); // 步骤3:设置按钮,将设置的值显示出来
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { // 显示传递过来的值
text.setText(message); }
}); return contentView;
}
}
2、Fragment传递给Activity
采用 接口回调 方式。
- 步骤1:在
Activity
的布局文件定义1占位符(FrameLayout
)
RelativeLayout 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: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="scut.carson_ho.fragment_2_activity.MainActivity"> <TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="等待Fragment发送消息" /> <Button
android:id="@+id/button"
android:layout_below="@+id/text"
android:text="点击接收Fragment消息"
android:layout_centerInParent="true"
android:textSize="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> <FrameLayout
android:layout_below="@+id/button"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="500dp"/> </RelativeLayout>
- 步骤2:设置
Fragment
的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
> <TextView
android:id="@+id/fragment"
android:text="我是fragment"
android:gravity="center"
android:textSize="30dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorAccent"/> </LinearLayout>
步骤3:设置回调接口
ICallBack.java
public interface ICallBack {
void get_message_from_Fragment(String string);
}
- 步骤4:设置
Fragment
的类文件
public class mFragment extends Fragment { @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View contentView = inflater.inflate(R.layout.fragment, container, false);
// 设置布局文件
return contentView;
} // 设置 接口回调 方法
public void sendMessage(ICallBack callBack){ callBack.get_message_from_Fragment("消息:我来自Fragment"); }
}
- 步骤5:设置
Acticvity
的类文件
public class MainActivity extends AppCompatActivity { Button button;
TextView text; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.button);
text = (TextView)findViewById(R.id.text); // 步骤1:获取FragmentManager
FragmentManager fragmentManager = getFragmentManager(); // 步骤2:获取FragmentTransaction
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); // 步骤3:创建需要添加的Fragment
final mFragment fragment = new mFragment(); // 步骤4:动态添加fragment
// 即将创建的fragment添加到Activity布局文件中定义的占位符中(FrameLayout)
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit(); button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { // 通过接口回调将消息从fragment发送到Activity
fragment.sendMessage(new ICallBack() {
@Override
public void get_message_from_Fragment(String string) {
text.setText(string);
}
}); }
});
} }
Fragment碎片的更多相关文章
- 14 Fragment 碎片总结
Fragment 碎片 一, Fragment是什么? Android 3.0以后出现的 Api11 以上 Activity的组成部分 Fragment(小的Activity) Fragment可以显 ...
- Fragment碎片的创建和动态更新
Fragment,在平板应用中较为参见,把视图分为两个甚至多个模块. 一,一个简单的fragment 1.创建两个局部文件,用于等待被调用 (1)left_fragment (2)right_frag ...
- fragment 碎片整理
activity_m1.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xm ...
- Android Fragment(碎片)的使用
简介 在Android中Fragment为一种可以嵌入活动中的UI片段.能让程序更加合理地利用大屏幕的空间. 使用方法 1.我们首先新建的一个onefragment.xml文件. <?xml v ...
- Android06-Fragment碎片
¨Fragment简介 ¨Fragment生命周期 ¨动态加载碎片Fragment Manager的使用 1.Fragment表示Activity中的一种行为或者一部分用户界面. 可以将Fragm ...
- Android Fragment碎片
什么是碎片? 碎片(Fragment)是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用的非常广泛.可以把Fragment当成Activity一个界面的一 ...
- Android之Fragment(碎片)方方面面
Fragment简介碎片(Fragment)是一种可以嵌入到活动当中的UI片段,它能让程序更加合理和充分的利用大屏幕的空间. Fragment的生命周期 它与Activity生命周期的关系: 可以看到 ...
- android UI:Fragment碎片
碎片(Fragment) 嵌入与活动中的UI片段,为了合理的分配布局而存在,这是我的简单理解.多用于兼顾手机与平板的UI,也适用于灵活高级的UI制作. Demo 简单的按键切换两片不同的Demo 新建 ...
- Fragment碎片频繁来回切换的时候报java.lang.IllegalStateException: No activity
出现这个问题的原因是因为使用的transcation.replace(fragmentTwo);的方式进行碎片切换的. 解决方案是使用add和show.hide方法组合实现碎片的切换(应该是显示.隐藏 ...
随机推荐
- Oracle数据库相关问题之ORA-12541:TNS:无监听程序
在用PL/SQL Developer等客户端工具连接oracle服务器时出现ORA-12541:TNS:无监听程序的错误,如下图: 发现原来是oracle的监听没有启动,重启监听后就连接成功了,下面跟 ...
- SSIS2012 项目部署模型
SSIS 2012 支持两种部署模型:项目部署模型和包部署模型. 使用项目部署模型可以将项目部署到 Integration Services 服务器,使用包部署模型可以将单独的包部署到Integrat ...
- A记录、CNAME、MX记录、NS记录
1. A记录(IP指向) 又称IP指向,用户可以在此设置子域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器找到相应网页的功能. 说明:指向的目标主机地址类型只能使用IP地址. 2. CNA ...
- Css定位之absolute_慕课网课程笔记
absolute和float 绝对定位和浮动有相似之处,即都有破坏性和包裹性,破坏性是指其会导致包裹自身的复原塌陷,包裹性是float的天赋技能,对于绝对定位来说,其会包括子元素 越独立越强大 1.去 ...
- freemarker 数据做加减计算
controller的部分: @Controller@RequestMapping("/ContactsFrameIndex")public class ContactsFrame ...
- Windows下通过socket进行字符串和文件传输
今天在windows平台下,通过socket实现了简单的文件传输.通过实现这一功能,了解基本的windows网络编程和相关函数的使用方法. 在windows平台上进行网络编程,首先都需要调用函数WSA ...
- 有一道题,大家能帮我看一下哪里错了吗?c++的
有一道题我不知道是哪里错了,大神们帮忙看一下,谢谢! 试题描述: 在四位自然数中有这样一些特点的数:(1)它们是素数:(2)将这些素数加上45后得到一个新的数值:(3)请同学们在这些新的数值中挑选出: ...
- Responsive设计——不同设备的分辨率设置
下面我们一起来看看CSS3 Meida Queries在标准设备上的运用,大家可以把这些样式加到你的样式文件中,或者单独创建一个名为“responsive.css”文件,并在相应的条件中写上你的样式, ...
- 空间不支持openssl解决办法
windows server2003 系统 IIS6.0 ,支付宝担保交易功能不能用,提示您的空间不支持openssl 解决办法如下:1.在C:\WINDOWS 下打开php.ini 将 extens ...
- iOS第三方库管理工具
作者:彷徨iOS 原文地址1:http://iostree.sinaapp.com/?p=78 原文地址2:http://blog.csdn.net/wzzvictory/article/detail ...