Android Fragment实用方法及交互实例

android3.0 新增的两个API,这篇文章主要是介绍fragment的用法,当然也有实例。先上源码:
简单来说fragment的生命周期其实和activity差不多,而在我们使用fragment的时候更多的却是使用他的
onCreateView方法,这个就相当于fragment开始布局,而它从这个方法之后几乎和activity一样了。所以在此我不再强调他的整个周期了。
该实例比较简单而我主要想阐述的是两个fragment如何相互之间通信。
 
activity进入时的界面界面布局:activity_main.xml
[Java] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
android:layout_width= "match_parent"
android:layout_height= "match_parent"
android:orientation= "horizontal" >
  
<fragment
android:id= "@+id/tag"
android:name= "com.godxj.fragments.fragmentsview.TagFragment"
android:layout_width= "0dp"
android:layout_height= "match_parent"
android:layout_weight= "1" />
  
  
<!--
<fragment
android:id= "@+id/details"
android:name= "com.godxj.fragments.fragmentsview.DetailFragment"
android:layout_width= "0dp"
android:layout_height= "match_parent"
android:layout_weight= "3.5" />
  
-->
  
<FrameLayout
android:id= "@+id/details_fragment"
android:layout_width= "0dp"
android:layout_height= "match_parent"
android:layout_weight= "3.5" />
  
</LinearLayout>


这里被注释的部分是用来比较,从代码中给FrameLayout添加fragment和直接在布局文件中添加fragment的区别,最终发现,虽然在最后达到的效果是一样的,但是实际上在代码中的交互却是有很大差异的。(差异稍后再议)

在布局文件中实用的com.godxj.fragments.fragmentsview.TagFragment该类很简单
[Java] 纯文本查看 复制代码
?
1
2
3
4
5
6
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tag, container, false );
return view;
}

TagFragment是一个继承自Fragment的类,只需要实现这个方法就行。次方法就是刚开始说的开始布局,实际上就是将view填到 activity_main.xml
对应的位置。 而在activity_main.xml中定义的FragmentLayout这个布局 如果需要添加一个fragment 便需要在代码中activity类中添加:
[Java] 纯文本查看 复制代码
?
1
2
3
4
5
6
7
FragmentManager fm = getSupportFragmentManager();
df = (DetailFragment) fm.findFragmentById(R.id.details_fragment);
df = new DetailFragment();
FragmentTransaction ft = fm.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.replace(R.id.details_fragment, df);
ft.commit();

当然,这里我也曾遇到过一个问题,我用3.2的 在df = (DetailFragment) fm.findFragmentById(R.id.details_fragment);(此处实际上可以省略)
(自己定义的一个继承自fragment的类)的时候出现了错误,事实上3.0以上的版本只要继承activity就不会出现错,但是我的却只能继承FragmentActivity才避免了出错。而且最终获得FragmentManager 的方法也是从android.support.v4.app.FragmentManager;这来获得。
此处的FragmentTransaction 相当于数据库的事物操作  开启一个事物 最后一定要记得提交。replace 就相当如 把这个实例化了的fragment放到FragmentLayout上面去。(如果你不想用FragmentLayout也可以,这样也不需要从代码中启动事物,只要像activity_main.xml注释掉了的代码那样就可以)

接下来的DetailFragment类 ,和前面的TagFragment是一样的但是为了后面方便讲解交互贴下代码:
[Java] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class DetailFragment extends Fragment {
  
private Button btn;
OnItemButtonClickListener buttonClickListener;
  
@Override
public void onAttach(Activity activity) {
super .onAttach(activity);
buttonClickListener = (OnItemButtonClickListener) activity;
}
  
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super .onActivityCreated(savedInstanceState);
}
  
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.details, container, false );
btn = (Button) view.findViewById(R.id.btn1);
buttonClickListener.sendViewToActivity(btn);
btn.setOnClickListener( new View.OnClickListener() {
  
@Override
public void onClick(View v) {
buttonClickListener.onItemViewClick(v);
}
});
return view;
}
public interface OnItemButtonClickListener{
void onItemViewClick(View v); 
void sendViewToActivity(View v);
}
}


主要方法任然是onCreateView。这里定义的接口是交互实用的后面讲解。当然还有两个xml文件布局就不用贴了,就是图上左边和右上边的那个布局。到此界面基本就算是构建完成了,就剩下两个个问题,fragment 和FragmentLayout,上面略次提到的--交互。

首先:第一个问题,用fragment 和FragmentLayout。如果使用fragment 那么我们在主activity中是可以得到fragment里面那些view的id并对其作出相应的处理的,这个就和自己定义在activity_main.xml里面的控件一样的操作。而用FragmentLayout你是无法对得到的view进行事件处理,实际上你根本无法得到Fragmentlayout里面的view。所以在交互的实际过程中处理起来就没用直接用fragment在布局文件中定义那么轻松。如果在布局文件中是两个fragment你完全可以像平时那样做。
然后:第二个问题, 如何交互。刚刚说到用fragment定义的布局是可以从主activity直接得到,而Fragmentlayout却不行,所以,最简单实际的方法就是讲在Fragmentlayout里面的view 传给主activity,而这个却是完全能实现的。buttonClickListener.sendViewToActivity(btn);此方法就是将
Fragmentlayout里面的btn暴露给主activity 然后它就可以想平时一样操作这些控件。
例子上的效果是如此:当点击最坐标那个图标叹号的时候出现的效果是这样的:
 
而当点击button1的时候效果又是:
 
实现了两者之间的交互。

本文转自:http://www.apkbus.com/forum.php?mod=viewthread&tid=103893

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值