主要思路
【服务器维护中,暂时不能上传图片】
托管Activity是实际的Activity,即要容纳Fragment的Activity。
抽象FragmentActivity的存在是为了提高代码复用性,实际上完全可以将代码内容整合到托管Activity中。这个抽象FragmentActivity的局限性在于,只能用于容纳某一数目(一般是1和2,一个Activity中的Fragment不宜过多)的Fragment。比如现在有一个容纳一个Fragment的抽象FragmentActivity,如果想要容纳两个Fragment,就要重写这个抽象类。
托管Layout是通用的,只要是继承自该抽象Activity的都可以用。在托管Layout中要定义Fragment。
Fragment与FragmentLayout是实际的controller与view,由Fragment来控制model。
具体代码
需要import的主要的包
- android.support.v4.app.Fragment
- android.support.v4.app.FragmentActivity
- android.support.v4.app.FragmentManager
此处以activity中存在两个fragment为例。
【抽象Activity】
TwoFragmentActivity.java
public abstract TwoFragmentActivity extends FragmentActivity
{
//由于不知道会生成哪个具体的Fragment
//便设置了抽象方法给子类具体实现
protected abstract Fragment createFragment1();
protected abstract Fragment createFragment2();
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContent(R.layout.activity_two_fragment);
//如果导入的是原生包而非支持包,应使用getFragmentManager()
//该成员负责管理该activity内的所有Fragment
FragmentManager fm = getSupportFragmentManager();
//将Fragment与布局文件中的Fragment绑定
Fragment f1 = fm.findFragmentById(R.id.fragment_container1);
//Fragment可能已经存在了
if (f1 == null)
{
f1 = createFragment1();
fm.beginTransaction().add(R.id.fragment_container1, f1).commit();
}
Fragment f2 = fm.findFragmentById(R.id.fragment_container2);
if (f2 == null)
{
f2 = createFragment2();
fm.beginTransaction().add(R.id.fragment_container2, f2).commit();
}
}
}
【托管Activity】
XXActivity.java
public XXActivity extends ThreeFragmentActivity
{
//具体实现创建Fragment的方法
@Override
protected Fragment onCreateFragment1()
{
return new Y1Fragment();
}
@Override
protected Fragment onCreateFragment2()
{
return new Y2Fragment();
}
}
【托管Layout】
activity_two_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<...Layout
xmln:android="http://schemas.android.com/apk/res/android"
...
/>
<...Layout
android:id="@+id/fragment_container1"
...
/>
<...Layout
android:id="@+id/fragment_container2"
...
/>
</...Layout>
【Fragment】
Y1Fragment.java
public class Y1Fragment extends Fragment
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
//设置View
View v = inflater.inflate(R.layout.fragment_y1, container, false);
//在Activity类内,绑定视图的时候
//所使用的findViewById(...)方法
//实际上是View类的方法
//但是在Activity内这么写即可
//但是在Fragment内,要具体指出
//即使用v.findViewById(...)方法
...
return v;
}
}
Y2Fragment.java
public class Y2Fragment extends Fragment
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View v = inflater.inflate(R.layout.fragment_y2, container, false);
...
return v;
}
}