Android Fragment实用方法及交互实例

来源:互联网 发布:工业机器人编程 编辑:程序博客网 时间:2024/06/09 20:17
简单来说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"
xmlns:tools="http://schemas.android.com/tools"
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
publicView onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tag, container, false);
returnview;
}

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 = newDetailFragment();
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
publicclass DetailFragment extendsFragment {
 
privateButton btn;
OnItemButtonClickListener buttonClickListener;
 
@Override
publicvoid onAttach(Activity activity) {
super.onAttach(activity);
buttonClickListener = (OnItemButtonClickListener) activity;
}
 
@Override
publicvoid onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
 
@Override
publicView 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(newView.OnClickListener() {
 
@Override
publicvoid onClick(View v) {
buttonClickListener.onItemViewClick(v);
}
});
returnview;
}
publicinterface OnItemButtonClickListener{
voidonItemViewClick(View v);
voidsendViewToActivity(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的时候效果又是:

实现了两者之间的交互。

0 0
原创粉丝点击