Fragmnet 初认识
Fragment 我称这为碎片布局,你也可以想像成Activity的模块,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块。
Fragment 当开发的应用程序同时适用于平板电脑和手机时,可以利用Fragment实现灵活的布局,改善用户体验。
通过图片应该对Fragment 有了大概的了解。
接下来我们可以通过一些例子再来深刻的了解一下这个神奇的Fragment,注如果你使用的是3.0之前的系统,需要先导入android-support-v4.jar包。
首先在layout文件下,建立fragment1.xml,fragment2.xml 这两个布局文件。
fragment1.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:layout_gravity="center"
android:text="Fragment1" />
</LinearLayout>
fragment2.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#003f3f" >
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#ffffff"
android:layout_gravity="center"
android:text="Fragment2" />
</LinearLayout>
光有两个布局文件还不行,我们还要新建两个类(继承Fragment类),Fragment1.claa和Fragment2.class
注意:有继承要导入的Fragment类时,如果是使用的android3.0以下的,请导入android-support-v4包里的Fragment,如果是使用3.0以上版本的,导入:import android.app.Fragment;否则会报销。
Fragment1.class:
public class Fragment1 extends Fragment{
//如果想要实现Fragment 提供UI,重写onCreateView().
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment1, container, false);
}
// onCreateView();有三个参数,inflater为适配器,container为Fragment在activity中的父容器。
//savedInstanceState 提供了一个实例数据。
//inflate()方法, 第一个是resource ID,指明了当前的Fragment对应的资源文件;第二个参数是父容器控件;
//第三个布尔值参数表明是否连接该布局和其父容器控件,在这里的情况设置为false,因为系统已经插入了这个布局到父控件,设置为true将会产生多余的一个View Group。
}
Fragment2.class:
public class Fragment2 extends Fragment{
//如果想要实现Fragment 提供UI,重写onCreateView().
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment2, container, false);
}
// onCreateView();有三个参数,inflater为适配器,container为Fragment在activity中的父容器。
//savedInstanceState 提供了一个实例数据。
}
继承Fragment :回调的有三个函数,onCreate(),onCreateView(),onPuse(),
onCreata(),系统在创建Fragment的时候调用这个方法,这里应该初始化相关的组件,一些即便是被暂停或者被停止时依然需要保留的东西。
onCreateView(),当第一次绘制Fragment的UI时系统调用这个方法,必须返回一个View,如果Fragment不提供UI也可以返回null。
onPuse(), 当用户离开Fragment时第一个调用这个方法,需要提交一些变化,因为用户很可能不再返回来。
然后就是加载Fragment布局的问题:
有两种方式,一个是在Activity_layout.xml布局文件,通过<Fragment />标签加载。第二种方式是在MainActivity.java通过 程序 加载到一个指定的viewGroup中,
第一种方式:
Activity_layout.xml:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);//无标题
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
运行得到的效果图如下:
第二种方式:
首先得去掉Activity_layout.xml 布局中的两个<Fragment/>标签。
在Activity处于运行状态的时候,可以在Activity的布局中动态地加入Fragment,只需要指定加入这个Fragment的父View Group即可。并且为Activity_layout.xml 中LinearLayout 标签添加 一个id.
mainactivity.java:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);//无标题
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取一个FragmentManager布局管理实例。
FragmentManager fragmentManager = getFragmentManager();
// 通过 布局管理实例 获取 一个fragmetnTransction 事务。beginTransaction()开启一个事务。
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment2 fragment = new Fragment2();
//第一个参数R.id.mainLayout为父容器,用add()方法将fragment对象添加到 父容器。
fragmentTransaction.add(R.id.mainLayout, fragment);
//commit()提交事务里的内容。
fragmentTransaction.commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
由空白页跑到的Fragmetn2 的布局:
Fragment之间的通信。
onAttach方法:Fragment和Activity建立关联的时候调用。
onCreateView方法:为Fragment加载布局时调用。
onActivityCreated方法:当Activity中的onCreate方法执行完后调用。
onDestroyView方法:Fragment中的布局被移除时调用。
onDetach方法:Fragment和Activity解除关联的时候调用。
如在Fragment 添加一个Button。
getActivity方法可以让Fragment获取到关联的Activity,然后再调用Activity的findViewById方法,就可以获取到和这个Activity关联的其它Fragment的视图了。
重写Fragment2
public class Fragment2 extends Fragment{
//如果想要实现Fragment 提供UI,重写onCreateView().
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment2, container, false);
}
// onCreateView();有三个参数,inflater为适配器,container为Fragment在activity中的父容器。
//savedInstanceState 提供了一个实例数据。
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Button button = (Button) getActivity().findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
TextView textView = (TextView) getActivity().findViewById(R.id.textView1);
Toast.makeText(getActivity(), textView.getText(), Toast.LENGTH_LONG).show();
}
});
}
}
效果图:
转载于:https://my.oschina.net/u/1773495/blog/306739
下一篇: 删除list倒数第n个元素