一个Fragment必须放在Activity中,它的生命周期直接被其所属的宿主Activity生命周期影响,它的状态会随宿主的状态变化而变化
Fragment生命周期图:
Activity的生命周期图:
Fragment加载UI的方法
onCreateView() 用来加载布局。
如果加载数据与UI无关使用onCreate
如果与UI有关,那么使用OnViewCreated
在Fragment中获取上下文不能传this
getActivity 或者 getContext来获取上下文
将一个Fragment添加到Activity上,
- 静态加载 xml的标签 fragment
必须的属性
id或者tag
name 用来指定加载哪个Fragment - 动态添加和移除
Eclipse中 需要修改成FragmentActivity
获取FragmentManager (getFragmentManager和getSupportFragmentManager)
//获取事务管理器
FragmentTransaction ft = manager.getFragmentTransaction;
//对Fragment进行操作
ft.commit();
add,remove,replace 直接移除Fragment,整个Fragment会被销毁。
attach detach 只是销毁视图,创建视图,保留整个Fragment的实例。
show hide 只是隐藏Fragment,保存整个UI的操作 - 如果Fragment个数不确定,很多,那么必须使用第一种。
- 如果Fragment需要保存UI操作,那么选择第三种。
- 如果Fragment只需要保存数据,选择第二种。
FragmentManager
一共三个
Fragmentmanager app
getSupportManager v4
getChildFragmentManager >> 在一个Fragment里面在嵌套一个Fragment
Fragment回退栈
ft.addToBackStack(null);每次保存Fragment的任务状态,按返回键返回上一次保存的状态
Fragment传递参数
- Activity在构建Fragment的时候,向他传递参数
setArguments(Bundle b); bundle可以携带基础数据类型,数组,以及序列化对象 - Activity想xml中的Fragment传递数据
//找到xml中静态创建的Fragment
framgent = (ContentFragment)
getSupportFragmentManager().findFragmentByTag(“fragment”);
//findFragmentById(R.id.fragment); - Fragment之间传参 非常少
通过Activity作为桥梁,获取FragmentManager.findFragmentById(Tag)获取引用; - 任何的类都可以通过单例模式来获取数据
Android组件单例(View,Fragment,Activity,Application)都不允许构造方法私有
化
必须保证该对象是单例的2. Application由系统创建,已经保持了单例
Activity由系统创建,也保持了单例
但是Fragment由自己创建,并没有保持单例
1. 静态本类对象
static MainActivity instance;
2. 公开访问方法
public static MainActivity getInstance() {
return instance;
}
3. 在生命周期onCreate的时候 将静态本类对象赋值
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = this;
setContentView(R.layout.activity_main);
}
小写标签说明不是一个View include fragment merge
Fragment和Activity的运行时生命周期对比:
下面一个案例Fragment之间的传参,点击左边获取右边的对话框的输入,反之也可以
MainActivity类
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Frag类
public class Frag extends Fragment {
EditText et;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return View.inflate(getActivity(),R.layout.frag,null);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
et = (EditText) view.findViewById(R.id.et);
view.findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (getId() == R.id.a){
Frag frag = (Frag) getActivity().getSupportFragmentManager().findFragmentById(R.id.b);
Toast.makeText(getActivity(),frag.getMsg(),Toast.LENGTH_SHORT).show();
}else {
Frag frag = (Frag) getActivity().getSupportFragmentManager().findFragmentById(R.id.a);
Toast.makeText(getActivity(),frag.getMsg(),Toast.LENGTH_SHORT).show();
}
}
});
}
public String getMsg(){
return et.getText().toString();
}
}
activity_main.xml类
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"
android:orientation="horizontal"
tools:context="com.example.fragment10_24.MainActivity">
<fragment
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/a"
android:name="com.example.fragment10_24.Frag"
android:layout_weight="1"/>
<fragment
android:layout_width="0dp"
android:id="@+id/b"
android:name="com.example.fragment10_24.Frag"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
frag.xml类
<?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">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et"
android:hint="输入内容"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btn"
android:text="获取另外一边的信息"/>
</LinearLayout>