乐者为王

Do one thing, and do it well.

TabActivity is deprecated

最近在整理Android Tab导航总结的代码时发现 TabActivity在API 13中被标记为过期了,所以就去寻找它的替换类,能尽量满足最小修改的要求。发现可以使用FragmentActivity来替代,Fragment组件作为标签页添加。

Fragment是Android 3.0引入的一个新概念,主要是为了适应各种不同的屏幕大小,它非常类似于Activity,可以像Activity一样包含布局,但是不能单独存在,只能存在于Activity中。下图是Fragment在不同屏幕上的显示以及Fragment与所在Activity的关系:

重构前的布局:

1
2
3
4
5
6
7
8
MainActivity extends TabActivity
    TabHost - tabhost
        LinearLayout
            TabWidget - tabs
            FrameLayout - tabcontent
                TabSpec (Activity)
                ...
                TabSpec (Activity)

重构后的布局:

1
2
3
4
5
6
7
8
MainActivity extends FragmentActivity
    TabHost - tabhost
        LinearLayout
            TabWidget - tabs
            FrameLayout - tabcontent
                TabSpec (Fragment)
                ...
                TabSpec (Fragment)

把TabLeftActivity和TabRightActivity分别改成LeftFragment和RightFragment:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class LeftFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.tab_left, container, false);

        // do something
        // 不能直接使用findViewById()方法,必须加上rootView前缀
        // 如果要引用当前绑定的Activity实例,使用getActivity()方法

        return rootView;
    }
}

然后在main.xml中的FrameLayout里添加两个Fragment组件:

1
2
3
4
5
6
7
8
9
<fragment android:name="com.example.fragments.LeftFragment"
    android:id="@+id/fragment_left"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<fragment android:name="com.example.fragments.RightFragment"
    android:id="@+id/fragment_right"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

把MainActivity改成从FragmentActivity继承。这里不能像TabActivity一样直接用getTabHost(),需要改成如下代码:

1
2
TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost);
tabHost.setup();

到这边就已经完成了,其它tabHost.addTab的使用方式一模一样。

Comments