安卓014Fragment

来源:互联网 发布:linux查看svn仓库目录 编辑:程序博客网 时间:2024/06/04 20:05

一、  你好 Fragment 
Fragment是Android3.0新增的概念,中文意思是碎片,它与Activity十分相似,用来在一个
Activity 中描述一些行为或一部分用户界面.使用多个 Fragment 可以在一个单独的 Activity 中
建立多个 UI 面板,也可以在多个 Activity 中使用 Fragment
一个 Fragment 必须总是被嵌入到一个 Activity 中,它的生命周期直接被其所属的宿主 Activity
生命周期影响,它的状态会随宿主的状态变化而变化.
要创建一个 Fragment 必须创建一个 Fragment 的子类,或者继承自另一个已经存在的
Fragment 的子类.并重写
onCreate()//初始化一些组件
onCreateView()//第一次使用的时候加载 UI
onPause()//指示用户会离开这个 Fragment
说明:当系统首次调用 Fragment 时,如果想绘制一个 UI 界面,那么在 Fragment 中,必须重写
onCreateView()方法返回一个 View,否则,如果 Fragment 没有 UI 界面,那么可以返回 null.
// 初始化Fragment 实例化一些成员变量
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
// 给Fragment加载UI的布局
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState)
{
View view = inflater.inflate(R.layout.hello, null);
return view;
}
如下图,左边是Activity 里面的,右边就是我们这里遇到的碎片
二、 Activity  中添加 Fragment
2.1.  方法一(Activity  的布局文件中加入<fragment> 标签)
在Activity布局中添加一个fragment标签,添加android:name属性,表示
fragment在xml中初始化
<LinearLayout
android:id="@+id/line"
android:layout_width="match_parent"
android:layout_height="150dp"
android:layout_marginTop="50dp"
android:background="#cccccc"
android:orientation="vertical" >
<fragment
android:id="@+id/myfragment"
android:name="com.hua.activity.HelloFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
2.2.  方法二( 使用 FragmentTransaction 的 的 add() 方法加入 fragment)
1.获取到 FragmentManager,在 Activity 中可以直接通过 getFragmentManager 得到。
2.开启一个事务,通过调用 beginTransaction 方法开启。
3.向容器内加入 Fragment,一般使用 replace 方法实现,需要传入容器的 id 和 Fragment 的实
例。
4.提交事务,调用 commit 方法提交。
说明:
FragmentManager
1.可以配合 FragmentTransaction,切换 Fragment(比如:add、replace 和 remove)
2.在其他组件中使用某个 Fragment 中的控件
FragmentTransaction
必须开启事务之后再使用 replace 或 add 方法修改 Fragment 之后再 commit 提交给 Activity
方能有显示的效果
①在 Activity 布局中添加一个 ViewGroup,比如 LinearLayout,并提供一个 id
②使用 FragmentManager 和 FragmentTransaction
FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction =
fragmentManager. beginTransaction() ;
③在代码中实例化你定义的 fragment
④通过 FragmentTransaction 中的 add 方法将 fragment 加入到 Activity 布局中
⑤调用 commit 提交该事务
//声明一个Fragment到的管理者
private FragmentManager manager;
//声明一个Fragment的事务
private FragmentTransaction transaction;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
manager=getFragmentManager();
transaction=manager.beginTransaction();
HelloFragment helloFragment=new HelloFragment();
transaction.add(R.id.line, helloFragment); //注意
transaction.commit();
}
三、 Fragment  回退栈
当使用 APP 时,从上一个页面跳转到下一个页面,按返回之后通常要返回到上一个页面,
如果所有的页面都是用 Fragment 做的,那么按返回是结束的 Activity,如果想返回到上一个
Fragment 可以使用 Fragment 的回退栈
使用方法
FragmentTransaction 提供了一个 addToBackStack(String tag):tag 就是指加入回退栈的名称就
是下图中的 tag, 把 注意,要使用回退栈的功能是在动态把 Fragment  加入到 Activity  里面
时一定要使用带三个参数的 replace  方法
示例代码
transcation=manager.beginTransaction();
MyFragment2 f2=new MyFragment2();
transcation.replace(R.id.right, f2, "f2");
transcation.addToBackStack("f2");
transcation.commit();
其它方法
manager.getBackStackEntryCount();方法得到栈里的 Fragment 个数
四、 Fragment  的生命周期
Activity  Fragment
onCreated
onAttach:连接宿主 Activity,参数为接收的 Activity 对象
onCreate:创建 Fragment
onCreateView:创建 Fragment 视图,如果没有 UI,返回值为 null
onActivityCreated:当Activity创建完毕后调用该方法,一般为实例化Activity
中的组件
onStart  onStart:与 Activity 一致
onResumed  onResume:与 Activity 一致
onPaused  onPause:与 Activity 一致
onStopped  onStop:与 Activity 一致
onDestroyed  onDestroyView:销毁 Fragment 视图,与 onCreateView 对应
onDestroy:销毁 Fragment 对象,与 onCreate 对应
onDetach:断开 Activity 连接,与 onAttach 对应
当 Activity 启动时
当点击部门管理时
点击员工管理时
当点击返回键
由些可见
①当 Activity 创建时,会调用 Fragment 的 onAttach,onCreate,onCreateView,onActivityCreated
②当 Activity 启动时,调用 Fragment 的 onStart
③当 Activity 获得焦点时,调用 Fragment 的 onResume
④当跳转到另一个 Activity 时,分别调用 Fragment 的 onPause,onStop
⑤当返回此 Activity 时,调用 Fragment 的 onStart,onResume
⑥销毁 Activity 时,依次调用 Fragment 的 onDestroyView、onDestroy、onDetach
⑦注意:一个 Fragment 的 onCreate 方法只会被调用一次
生命周期图
五、 Fragment 、Activity  之间传数据
5.1 Fragment  如何互相传数据
//获得第二个输入框的值
Fragment2 f2=(Fragment2) getFragmentManager().findFragmentByTag("f2");
EditText editText=(EditText) f2.getView().findViewById(R.id.editRight);
Toast.makeText(getActivity(), "右边的值为:"+editText.getText().toString(), 1).show();
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
manager=getFragmentManager();
transaction=manager.beginTransaction();
Fragment1 f1=new Fragment1();
Fragment2 f2=new Fragment2();
transaction.add(R.id.leftLayout, f1, "f1");
transaction.add(R.id.rightLayout, f2, "f2");
transaction.commit();
}
5.2 Activity  和 Fragment  如何互相传数据
1,思路:在 Fragment 里面得到 Activity 的上下文,再得找到 XML 的组件,再去得
到其中的值
View listView = getActivity().findViewById(R.id.list);
2,使用 setArguments();
5.3  通 过回调向 Activity  传值
Fragment  Activity
①创建一个 Callback 接口,添加回调方法
public interface OnArticleSelectedListener {
public void onArticleSelected(String
msg);
}
①实现 FragmentA 中的回调接口
②在 onAttach()方法中,使用连接的 Activity
对象对回调接口对象进行实例化
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
//将连接的 activity 进行造型
mListener  =  (OnArticleSelectedListener)
activity;
}
②重写回调接口中的方法
@Override
public void onArticleSelected(String msg) {
Log.i(“TAG”,msg);
}
③在相应点击事件中,触发回调方法通知
Activity
@Override
public void onListItemClick(ListView l, View v,
int position, long id) {
super.onListItemClick(l, v, position, id);
//当用户点击 item 时触发回调方法,并将
position 传递给 Activity
mListener.onArticleSelected(position);
}
六、 ListFragment  实现列表数据
一、定义:一个包含 ListView 的 Fragment
二、关于布局
1.当仅需要 ListView 组件时,可以不使用 onCreateView 方法
2.如果想设置一个自定义布局,那么该布局必须要有一个 ListView 控件,且其 id 必须为
“@id/android:list”;
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="8dp"
android:paddingRight="8dp">
<ListView android:id="@id/android:list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00FF00"
android:layout_weight="1"
android:drawSelectorOnTop="false"/>
<TextView android:id="@id/android:empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FF0000"
android:text="No data"/>
</LinearLayout>
三、使用
1.设置 Adapter
添加 Adapter 时,需要在 onActivityCreated()方法中添加
设置 Adapter 使用 setListAdapter()方法
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ArrayAdapter<String>  adapter  =  new
ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,data);
setListAdapter(adapter);
}
2.添加点击事件
①设置监听器
getListView.setOnItemClickListener()...
②使用回调方法
onListItemClick()
案例效果
七、 DialogFragment  实现弹出框[ 常用]
一、特点: 对对话框加入了生命周期方法,可使用户在切换屏幕时对话框不会
消失
二、使用步骤:
1.创建一个类,继承 DialogFragment
2.重写 onCreateDialog 方法,添加对话框,注意返回值为 Dialog 类对象
3.使用 show 调用,例如:show(getFragmentManager(),"dialog");
public void showConfimDialog(View view) {
FireMissilesDialogFragment d = new FireMissilesDialogFragment();
d.show(getFragmentManager(), "");
}
0 0
原创粉丝点击