连Action Bar都不会 你能说你学过 Android?

简介: 连Action Bar都不会 你能说你学过 Android?

零、前言

Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式。在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为action bar能够使应用程序给用户提供一致的界面,并且系统能够很好根据不同的屏幕配置来适应操作栏的外观。

什么是Action Bar,说白了就是手机APP最上方的一块标题区域,如下图所示:

 

一、显示 / 隐藏  Action Bar

 

1. XML实现

修改res/value/style.xml中的parent属性,具体代码如下,请注意第二行代码的区别。

显示:

1. <resources>
2. 
3. <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
4. <!-- Customize your theme here. -->
5. <item name="colorPrimary">@color/colorPrimary</item>
6. <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
7. <item name="colorAccent">@color/colorAccent</item>
8. </style>
9. 
10. </resources>

隐藏:

1. <resources>
2. <!-- Base application theme. -->
3. <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
4. <!-- Customize your theme here. -->
5. <item name="colorPrimary">@color/colorPrimary</item>
6. <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
7. <item name="colorAccent">@color/colorAccent</item>
8. </style>
9. 
10. </resources>

因为在AndroidManifest.xml中,需要引用这个数据(第七行代码)

1. <application
2. android:allowBackup="true"
3. android:icon="@mipmap/ic_launcher"
4. android:label="@string/app_name"
5. android:roundIcon="@mipmap/ic_launcher_round"
6. android:supportsRtl="true"
7. android:theme="@style/AppTheme">
8. <activity android:name=".MainActivity">
9. <intent-filter>
10. <action android:name="android.intent.action.MAIN" />
11. 
12. <category android:name="android.intent.category.LAUNCHER" />
13. </intent-filter>
14. </activity>
15. </application>

2.通过Java代码实现

首先在XML文件设置两个按钮,一个负责显示Action Bar,一个隐藏Action Bar,代码如下所示:

1. <Button
2. android:id="@+id/actionBar_show"
3. android:layout_width="wrap_content"
4. android:layout_height="wrap_content"
5. android:text="显示ActionBar"
6. android:textAllCaps="false" />
7. 
8. <Button
9. android:id="@+id/actionBar_hide"
10. android:layout_width="wrap_content"
11. android:layout_height="wrap_content"
12. android:text="隐藏ActionBar"
13. android:textAllCaps="false" />

接着,需要用到如下 头文件

1. import android.app.ActionBar;
2. import android.support.v7.app.AppCompatActivity;
3. import android.os.Bundle;
4. import android.view.View;
5. import android.widget.Button;

定义两个按钮,和Action Bar的全局变量:

1. Button action_show, action_hide; //定义显示与隐藏按钮
2. android.support.v7.app.ActionBar actionBar; //定义V7包下的ActionBar

接着,编写按钮的单击事件相应函数:

1. View.OnClickListener l = new View.OnClickListener() { //创建一个新的监听事件l
2. @Override
3. public void onClick(View v) {
4. switch (v.getId()) {  //根据选择按钮的id判断
5. case R.id.actionBar_show:
6.                 actionBar.show(); //显示ActionBar动作栏
7. break;
8. case R.id.actionBar_hide:
9.                 actionBar.hide(); //隐藏ActionBar动作栏
10. break;
11.         }
12.     }
13. };

最后,补全Java代码,赋予按钮刚刚写的单击事件。

1. @Override
2. protected void onCreate(Bundle savedInstanceState) {
3. super.onCreate(savedInstanceState);
4.     setContentView(R.layout.activity_main);
5.     actionBar = getSupportActionBar(); //获取ActionBar动作栏
6.     action_show = (Button) findViewById(R.id.actionBar_show); //获取显示按钮
7.     action_hide = (Button) findViewById(R.id.actionBar_hide); //获取隐藏按钮
8.     action_show.setOnClickListener(l); //为显示按钮设置监听事件
9.     action_hide.setOnClickListener(l); //为隐藏按钮设置监听事件
10. }


二、添加 Action Bar 的 Item 子项

 

首先,需要以下两个头文件:

1. import android.view.Menu;
2. import android.view.MenuInflater;

添加菜单代码:

我们需要重写 onCreateOptionsMenu 方法

注意这是固定写法,不要乱改!

1. @Override
2. protected void onCreate(Bundle savedInstanceState) {
3. super.onCreate(savedInstanceState);
4.     setContentView(R.layout.activity_main);
5. //隐藏ActionBar中显示的标题
6.     getSupportActionBar().setDisplayShowTitleEnabled(false);
7. }
8. @Override
9. public boolean onCreateOptionsMenu(Menu menu) {
10.     MenuInflater inflater=getMenuInflater();  //实例化一个MenuInflater对象
11.     inflater.inflate(R.menu.menu,menu);       //解析菜单文件
12. return super.onCreateOptionsMenu(menu);
13. }

接着,我们就创建这个menu文件

在res 目录下新建一个 menu 文件夹,在该文件夹下新建一个 menu.xml 文件,该文件用来定义菜单选项

1. <?xml version="1.0" encoding="utf-8"?>
2. <menu xmlns:android="http://schemas.android.com/apk/res/android"
3. xmlns:app="http://schemas.android.com/apk/res-auto">
4. <item
5. android:id="@+id/search1"
6. android:icon="@drawable/search"
7. android:title="search"
8. app:showAsAction="always"></item>
9.     //----此处省略更多item
10. </menu>

注意1:app:showAsAction

app:showAsAction="always"

app:showAsAction属性用来控制是否在 Action Bar 上显示

如果是 always ,则默认显示

如果是 ifRoomAction Bar上有空则显示

如果是 never,则默认隐藏到三个点区域里面;

显示效果如下图:

隐藏Item,点击三个点图标后,可以显示,如下图:

注意2:android:title 和 android:icon

1. android:icon="@drawable/bell"
2. android:title="消 息"

android:title属性是被隐藏后显示的文字;

android:icon是没被隐藏时显示的图标

如果只有android:title,但没有android:icon,被强制显示,Action Bar会显示文字,如下图所示:

如果只有android:icon,但没有android:title,被强制隐藏,Action Bar会显示空白,如下图所示:

注意3:app:actionViewClass

1. <item
2. android:id="@+id/search2"
3. android:title="search"
4. app:actionViewClass="android.support.v7.widget.SearchView"
5. app:showAsAction="always">
6. </item>

在 Action Bar 上添加组件,如搜索框,

单击后,会显示搜索栏:

注意4:app:actionLayout

指的是通过Layout文件,添加 Action Bar Item项

如XML文件定义一个图片

1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:layout_width="match_parent"
4. android:layout_height="match_parent"
5. android:orientation="vertical">
6. 
7. <ImageView
8. android:layout_width="wrap_content"
9. android:layout_height="wrap_content"
10. android:layout_marginTop="14dp"
11. android:src="@drawable/add" />
12. </LinearLayout>

引用

1. <item
2. android:id="@+id/img2"
3. android:title="添加"
4. app:actionLayout="@layout/img_add"
5. app:showAsAction="always"></item>

效果如下图所示:

模版代码

1. <item
2. android:id="@+id/search1"
3. android:icon="@drawable/search"
4. android:title="search"
5. app:showAsAction="never"></item>
6. <item
7. android:id="@+id/bell"
8. android:icon="@drawable/bell"
9. android:title="消 息"
10. app:showAsAction="never"></item>
11. <item
12. android:id="@+id/settings"
13. android:title="设 置"
14. app:showAsAction="ifRoom"></item>
15. <item
16. android:id="@+id/about"
17. android:title="关 于"
18. app:showAsAction="never"></item>
19. <item
20. android:id="@+id/search2"
21. android:title="search"
22. app:actionViewClass="android.support.v7.widget.SearchView"
23. app:showAsAction="always"
24.         ></item>
25. <item
26. android:id="@+id/img1"
27. android:title="通讯录"
28. app:actionLayout="@layout/img_message"
29. app:showAsAction="never"></item>
30. <item
31. android:id="@+id/img2"
32. android:title="添加"
33. app:actionLayout="@layout/img_add"
34. app:showAsAction="ifRoom"></item>

三、顶部 Tab 导航

效果:

实现:

1.先创建若干子界面的fragment.xml文件,每个子页面放一张背景图片即可。

1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:layout_width="match_parent"
4. android:layout_height="match_parent"
5. android:orientation="vertical">
6. 
7. <ImageView
8. android:layout_width="match_parent"
9. android:layout_height="match_parent"
10. android:scaleType="fitXY"
11. android:src="@drawable/fragment_5"
12.         />
13. </LinearLayout>

2.创建子界面的Java文件,和XML文件相对应。

1. import android.os.Bundle;
2. import android.support.annotation.Nullable;
3. import android.support.v4.app.Fragment;
4. import android.view.LayoutInflater;
5. import android.view.View;
6. import android.view.ViewGroup;
7. 
8. public class Fragment5 extends Fragment {
9. @Nullable
10. @Override
11. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
12. return inflater.inflate(R.layout.fragment_5,null); //加载布局页面
13.     }
14. }

3.接着创建MyTabListener.java文件,用于统一管理Tab页面

1. import android.app.Activity;
2. import android.support.v4.app.Fragment;
3. import android.support.v4.app.FragmentTransaction;
4. import android.support.v7.app.ActionBar;
5. 
6. public class MyTabListener implements ActionBar.TabListener {
7. private Fragment fragment;  //定义Fragment
8. private final Activity activity; //定义Activity
9. private final Class aClass; //定义Class
10. 
11. public MyTabListener(Activity activity, Class aClass) { //添加构造函数
12. this.activity = activity;
13. this.aClass = aClass;
14.     }
15. @Override
16. public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
17. //判断碎片是否初始化
18. if (fragment == null) { //如果没有初始化,将其初始化
19.             fragment = Fragment.instantiate(activity, aClass.getName());
20.             ft.add(android.R.id.content, fragment, null);
21.         }
22.         ft.attach(fragment); //显示新画面
23.     }
24. 
25. @Override
26. public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
27. if (fragment != null) {
28.             ft.detach(fragment); //删除旧画面
29.         }
30.     }
31. 
32. @Override
33. public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
34. 
35.     }
36. }

4.接着在MainActivity.java中放入子页面(其中MainActivity对应的XML文件不需要修改)

1. import android.support.v7.app.AppCompatActivity;
2. import android.support.v4.app.Fragment;
3. import android.support.v7.app.ActionBar;
4. import android.os.Bundle;
5. 
6. public class MainActivity extends AppCompatActivity {
7. 
8. @Override
9. protected void onCreate(Bundle savedInstanceState) {
10. super.onCreate(savedInstanceState);
11.         setContentView(R.layout.activity_main);
12.         ActionBar actionBar=getSupportActionBar(); //获取ActionBar
13.         actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  //设置ActionBar为选项卡模式
14.         actionBar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);  //隐藏标题栏
15.         actionBar.addTab(actionBar.newTab().setText("词典"). //将标签页添加ActionBar中
16.                 setTabListener(new MyTabListener(this, Fragment1.class)));
17.         actionBar.addTab(actionBar.newTab().setText("百科"). //将标签页添加ActionBar中
18.                 setTabListener(new MyTabListener(this, Fragment2.class)));
19.         actionBar.addTab(actionBar.newTab().setText("翻译").将标签页添加ActionBar中
20.                 setTabListener(new MyTabListener(this, Fragment3.class)));
21.         actionBar.addTab(actionBar.newTab().setText("发现").//将标签页添加ActionBar中
22.                 setTabListener(new MyTabListener(this, Fragment4.class)));
23.         actionBar.addTab(actionBar.newTab().setText("我的").//将标签页添加ActionBar中
24.                 setTabListener(new MyTabListener(this, Fragment5.class)));
25.     }
26. 
27. }

 

四、实现界面返回按钮

效果:

首先给第一个界面的按钮添加单击事件相应,使其跳转到第二个界面

1. @Override
2. public void onClick(View v) {
3.     Intent intent=new Intent(MainActivity.this,friends.class);
4.     startActivity(intent);
5. }

接着要在第二个界面中判断第二个界面的父界面是否为空,如果不为空,则显示返回按钮。

1. if (NavUtils.getParentActivityName(friends.this) != null) {
2.     getSupportActionBar().setDisplayHomeAsUpEnabled(true);
3. }

最后要在AndroidManifest.xml中,定义第二个界面的父界面是第一个界面

1. <activity android:name=".friends"
2. android:label="@string/friend">
3. <meta-data
4. android:name="android.support.PARENT_ACTIVITY"
5. android:value=".MainActivity" />
6. </activity>

其中可以修改一下 AndroidManifest.xml中 ,android:theme 属性,即 Action Bar 背景颜色

android:theme="@style/Theme.AppCompat.Light.DarkActionBar"

改完之后,颜色就变黑了


本次主要总结了Android开发中Action Bar的基础使用。

当然现在已经不会去开发原生安卓了,而会使用uni-app来顺带开发Android,但我个人觉得基础还是要打扎实。


相关文章
|
Android开发
Android获取设备状态栏status bar高度的正确姿势
Android获取设备状态栏高度的正确姿势 正确代码方式: int height = 0; int resourceId = getApplicationContext().
5525 0
|
XML 缓存 Java
Android Studio Assistant 基础功能 —— Action
快速玩转 AS Assistant —— 更多交互即刻实现
1014 0
Android Studio Assistant 基础功能 —— Action
|
Android开发
Android Design Support Library全解:Part 1 Floating Action Button 悬浮按钮
Android Design Support Library系列第一弹,悬浮按钮 悬浮按钮(Floating action button ,FAB) 简单来说是一种圆形按钮,其悬浮于UI之上,四周有阴影环绕,可以用于实现一些高级操作,比如添加新的条目,或是为邮件添加附件等等。
1390 0
|
Android开发 容器 开发工具
android--外部启动activity,自定义action,action常量大全
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/52955810 从任意app,启动另外一个app的activity: 1.
1132 0
|
XML Android开发 数据格式
Android官方开发文档Training系列课程中文版:添加ActionBar之添加Action按钮
原文地址 : http://android.xsoftlab.net/training/basics/actionbar/adding-buttons.html 添加Action按钮 ActionBar允许在当前的APP上下文内添加很多重要的功能按钮。
764 0
|
Java Android开发 数据格式
Android Quick Return Bar导航条
 Android Quick Return Bar导航条 之前写了一些文章是关于Android Toolbar各种变换形式和作用: (文章1)《Android Material Design:基于Coordinato...
747 0