Fragment与Activity的关系
Fragment是Android3.0 之后提出的新功能,低于3.0的版本,使用Fragment要继承v4包中提供的Fragment,同时Activity也要继承v4包中提供的FragmentActivity来实现碎片化布局。Fragment不能单独使用,必须要嵌入到Activity中由Activity管理,来分担Activity的压力,Activity管理Fragment的显示和隐藏,实从而现多业务的展示效果。
Activity中添加Fragment
在Activity中添加Fragment有两种方式:第一,Xml中静态注册;第二,Java代码中添加。
Xml中静态注册Fragment
首先,定义XxxFragment类继承Fragment,完成相关的配置。
//ListFragment类似ListActivity(不需要setContentView)自带一个ListView
public class LeftFragment extends ListFragment {
private String[] items = { "Java基础", "Java高级编程", "数据库",
"Android基础 ", "Android 进阶 ", " 项目实战 ", " 项目管理 " };
//当布局加载完毕时触发
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
getActivity(),android.R.layout.simple_list_item_1,items);
// 给自带的 ListView 设置适配器
setListAdapter(adapter);
}
//ListFragment 中自带的 ListView 的 item 点击监听
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
String str = items[position];
Toast.makeText(getActivity(), " 点击了: " +
str, Toast.LENGTH_SHORT).show();
}
}
其次,在Activity(FragmentActivity)的布局中添加fragment 标签
<fragment
android:id="@+id/fragment_left"
android:layout_width="200dp"
android:layout_height="match_parent"
android:name="com.yee.fragment.LeftFragment" />
Java代码中添加Fragment
第一步,定义XxxFragment类继承Fragment,完成相关的配置
public class RightFragment extends Fragment {
//如果需要通过New来创建Fragment对象的方法传递数据,官方建议使用如下
//静态方法来获取对象,并把数据打包Bundle,然后存入setArguments
public static RightFragment newInstance(String str,int position){
RightFragment f = new RightFragment();
Bundle b = new Bundle();
b.putString("content", str);
b.putInt("pos", position);
//设置内部参数,相当于此Fragment与生俱来的参数不可变,只能在显示之前使用
f.setArguments(b);
return f;
}
//配置 Fragment 的布局
@Override
public View onCreateView(LayoutInflater inflater, @Nullable
ViewGroup container, @Nullable Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.fragment_right, null);
return layout;
}
//布局创建成功
@Override
public void onViewCreated(View view,
@Nullable Bundle savedInstanceState) {
TextView tv = (TextView) view.findViewById(R.id.tv);
//内部参数的获取方法
String content = getArguments().getString("content");
//显示内容
tv.setText(content);
}
// 获取当前碎片显示的下标
public int getIndex(){
return getArguments().getInt("pos");
}
}
第二步,获取 FragmentManager 管理Fragment
public class LeftFragment extends Frag
//获取碎片管理器
FragmentManager fm = getFragmentManager();
//检测布局中右侧(内容区)是否有内容碎片在显示
RightFragment fragment = (RightFragment)
fm.findFragmentById(R.id.content);
if (fragment == null || position != fragment.getIndex()) {
//如果没有则加载新内容;
//有,则判断当前显示的下标与要显示的是不是一样的,不一样则替换新的内容进来
fragment = RightFragment.newInstance(str, position);
//获取碎片操作工具(显示、隐藏、替换、添加、移除、注册、取消注册)
FragmentTransaction ft = fm.beginTransaction();
//添加替换动画
ft.setCustomAnimations(android.R.anim.slide_in_left,
android.R.anim.slide_out_right);
//替换新的碎片进来
ft.replace(R.id.content, fragment);
//多个Fragment切换后,使用回退栈可以在按返回键后回到前一个fragment
ft.addToBackStack(null);
//commit()提交事务的操作必须在Activity保存状态之前使用,
//如果在状态保存之后,那么需要使用ft.commitAllowingStateLoss()提交事务
ft.commit();
}
}
Fragment动态管理(以选项卡框架为例)
通过replace实现,相当于移除旧的,同时添加新的Fragment,流程分三步:
1)oldFragment:onPause->onStop->onDestroyView
2)newFragment:onAttach->onCreate->onCreateView->onStart->onResume
3)oldFragment:onDestroy->onDettach
选项卡框架代码:
private void showFragment(int index){
//新页面跟当前页面不一样
if (index != currentIndex){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//隐藏旧的,显示新的(如果有显示过则重新显示,没有则创建新的)
if (currentIndex != -1){
//取消关联,销毁视图
ft.detach(fragments[currentIndex]);
}
//显示新的
if (fragments[index] == null){
//第一次显示,创建新视图
fragments[index] = createFragment(index);
//第一次显示,添加到容器保存
ft.add(R.id.card_content, fragments[index]);
}else {
//恢复关联,重建视图
ft.attach(fragments[index]);
}
ft.commit();
currentIndex = index;
}
}
Fragment跳转到Activity
无返回结果跳转
带返回结果跳转
与Fragment通信
Activity传递数据给Fragment
Fragment传递数据给Activity
waiting…
Fragment与Fragment通信
waiting…