现在的位置: 首页 > 综合 > 正文

【译】ActionBar 基础2

2018年09月16日 ⁄ 综合 ⁄ 共 2648字 ⁄ 字号 评论关闭

        在上一篇文章中我们用ActionBar实现了一个基本的动作,这篇文章我们将看看如何通过ActionBar来允许用户在我们的应用程序中导航。

     ActionBar支持基于tab(选项卡)和基于下拉两种基本类型的导航。在Play Movies 应用程序中可以发现基于tab导航的例子。
在这个例子中tabs被用于在电影(Films)和个人视频(Personal
Videos
)中进行选择。要实现tab导航需要我们创建一些Fragment,这些Fragment作为tabs的内容面板。每一个都包含一个简单的布局res/layout/frag1.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/frag1"/>
 
</RelativeLayout>
 
和一个简单的inflates这个布局的类Fragment1.java:
public class Fragment1 extends Fragment
{
    @Override
    public View onCreateView( LayoutInflater inflater,
        ViewGroup container,
        Bundle savedInstanceState )
    {
        return inflater.inflate( R.layout.frag1,
            container, false );
    }
}
      另一个class(类)和layout(布局)几乎是一样的除了为text分配不同的string资源和inflates frag2布局替代frag1。对于一个真实的应用程序这些会明显的复杂很多,但我故意使fragments保持简单,这样可以让我们把注意力放在导航上。
     接下来我们要创建一个 android.app.ActionBar.TabListener实例作为MainActivity的内部类:
private class MyTabListener
    implements ActionBar.TabListener
{
    private Fragment mFragment;
    private final Activity mActivity;
    private final String mFragName;
 
    public MyTabListener( Activity activity,
        String fragName )
    {
        mActivity = activity;
        mFragName = fragName;
    }
 
    @Override
    public void onTabReselected( Tab tab,
        FragmentTransaction ft )
    {
        // TODO Auto-generated method stub
    }
 
    @Override
    public void onTabSelected( Tab tab,
        FragmentTransaction ft )
    {
        mFragment = Fragment.instantiate( mActivity,
            mFragName );
        ft.add( android.R.id.content, mFragment );
    }
 
    @Override
    public void onTabUnselected( Tab tab,
        FragmentTransaction ft )
    {
        ft.remove( mFragment );
        mFragment = null;
    }
}

    它负责创建和添加一个fragment到主要内容区域android.R.id.content。

@Override
public void onCreate( Bundle savedInstanceState )
{
    super.onCreate( savedInstanceState );
        ActionBar ab = getActionBar();
    ab.setNavigationMode( ActionBar.NAVIGATION_MODE_TABS );
 
    Tab tab = ab.newTab()
        .setText( R.string.frag1 )
        .setTabListener(
            new MyTabListener( this,
                Fragment1.class.getName() ) );
    ab.addTab( tab );
 
    tab = ab.newTab()
        .setText( R.string.frag2 )
        .setTabListener(
            new MyTabListener( this,
                Fragment2.class.getName() ) );
    ab.addTab( tab );
}
    最后我们需要在MainActivity的onCreate 方法中实现这个。
     这里设置了所需的导航模式,然后创建了两个包含显示文本和相应fragment的类名的tab。需要指明的是我们并没有像往常一样在onCreate()中执行setContentView(),因为我们通过在TabListner中用android.R.id.content将fragments直接添加到了内容区域。如果我们想做一些更复杂的事,我们可以执行setContentView()来添加自定义的layout,但我们必须改变我们的TabListener将fragments添加到包含在自定义layout中的空容器来替代。要是我们运行目前为止我们创建的将会得到在两个fragment之间导航的tabs。

     有一点需要指名,由于没有足够的空间tab被分到了第二行,在大的设备上或切换到横屏模式就会有足够的空间,ActionBar会自动适应将用一行显示所有内容。

     在ICS版本(Android 4.0)或更新版本,将可以通过用uiOptions="splitActionBarWhenNarrow" 参数或在manifest的elements中控制这个。
    下一篇文章我们将看看基于下拉的导航,关于本文的代码资源可以在 here获得。

抱歉!评论已关闭.