简单来说fragment的生命周期其实和activity差不多,而在我们使用fragment的时候更多的却是使用他的
activity进入时的界面界面布局:activity_main.xml
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该类很简单
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类中添加:
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是一样的但是为了后面方便讲解交互贴下代码:
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