Android技术——视图切换(一)~(四)项目的源代码在:https://github.com/YongYuIT/MeiNv_Liulanqi
1、ActionBar是什么?
上图(上方一张)指出的区域显示的就是ActionBar,可以看到ActionBar里面的图片就是启动Action的icon(如下图下方一张所示),文字就是启动Action的Label。这两个属性分别是在AndroidManifest文件中的manifest-->application-->activity下的android:icon和android:label设置的。
其实,Android3.0以后默认启动了ActionBar,因此只要在AndroidManifest文件中设置app的目标SDK版本高于11就默认启用了ActionBar。如果希望关闭ActionBar可以在AndroidManifest文件中的manifest-->application下设置app的主题(android:theme)为Xxx.NoAction.Bar
在默认情况下ActionBar的图标就是当前Action的android:icon,标题就是当前Action的android:label。
我们可以在代码(当前Action的长下文中)中通过getActionBar()获得ActionBar的实例(假设为actionBar)。通过actionBar.setIcon(R.drawable.logo);或者actionBar.setLogo(R.drawable.logo);来自主设置ActionBar的图标。通过actionBar.setTitle("这是我自己设置的标题");来自主设置ActionBar的标题。
注意:AndroidManifest文件中的manifest-->application-->activity下的android:icon定义的是启动图标(也就是Android桌面上的图标),android:logo定义的是启动后ActionBar上显示的图标,android:logo缺省的情况下会自动取值于android:icon。
可以使用actionBar.show();和actionBar.hide();来控制ActionBar的可见和隐藏。
2、利用ActionBar实现Tab导航
ActionBar可以在屏幕顶部生成多个Tab项。当用户点击某个Tab项时,系统会根据用户点击时间导航到Tab页面。
利用ActionBar实现Tab导航步骤如下:
step1:调用ActionBar的setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);方法设置使用Tab导航方式。
step2:调用ActionBar的addTab()方法添加多个Tab项,并为每个Tab项添加事件监听器。
在实际项目中,为了更好地展现Tab导航效果,通常用Fragment充当Tab页面。
下面是利用ActionBar实现Tab导航的例子。
/MeiNv_Liulanqi/res/layout/activity_main.xml文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical" >
</LinearLayout>
/MeiNv_Liulanqi/res/layout/fragment_layout.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/img_meinv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@drawable/app_logo" />
</LinearLayout>
/MeiNv_Liulanqi/src/com/example/meinv_liulanqi/MeiNvFragment.java文件:
package com.example.tab_nav;
import android.app.Fragment;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
public class MeiNvFragment extends Fragment
{
public static int[] img_ids;
public static String Fragment_Key = "Fragment_Key";
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View v = inflater.inflate(R.layout.fragment_layout, null);
ImageView img_meinv = (ImageView) v.findViewById(R.id.img_meinv);
// 获取创建该Fragment时传入的参数Bundle
Bundle args = getArguments();
img_meinv.setImageResource(img_ids[args.getInt(Fragment_Key)]);
return v;
}
}
/MeiNv_Liulanqi/src/com/example/meinv_liulanqi/MainActivity.java文件:
package com.example.tab_nav;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.os.Bundle;
public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取ActionBar实例
ActionBar bar = this.getActionBar();
// 设置ActionBar的导航方式为Tab方式
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// 设置MeiNvFragment的img_ids参数
MeiNvFragment.img_ids = new int[] { R.drawable.linzhiling,
R.drawable.liuyan, R.drawable.yangmi };
// 添加Tab项;设置Tab项的标签;设置Tab项的事件监听器,在事件监听器中新建Fragment并用此Fragment替代原本的布局。
for (int i = 0; i < MeiNvFragment.img_ids.length; i++)
{
Tab t = bar.newTab();
t.setText("第" + (i + 1) + "个美女");
t.setTabListener(new MyTabListener());
bar.addTab(t);
}
}
class MyTabListener implements ActionBar.TabListener
{
public void onTabReselected(Tab arg0, FragmentTransaction arg1)
{
// TODO Auto-generated method stub
}
// 当指定Tab项被选中时激发该方法
@Override
public void onTabSelected(Tab arg0, FragmentTransaction arg1)
{
// TODO Auto-generated method stub
MeiNvFragment f = new MeiNvFragment();
// 向新建的MeiNvFragment传递参数
Bundle b = new Bundle();
b.putInt(MeiNvFragment.Fragment_Key, arg0.getPosition());
f.setArguments(b);
// 获取FragmentTransaction对象
FragmentTransaction ft = getFragmentManager().beginTransaction();
// 使用fragment代替该Activity中的container组件
ft.replace(R.id.container, f);
// 提交事务
ft.commit();
}
@Override
public void onTabUnselected(Tab arg0, FragmentTransaction arg1)
{
// TODO Auto-generated method stub
}
}
}
实现的效果: