美文网首页
使用动作条(Head First 学习笔记)

使用动作条(Head First 学习笔记)

作者: stbtk | 来源:发表于2017-12-22 19:45 被阅读0次

    使用动作条首先要使用一个带有动作条的主题,其次是创建一个菜单资源并为它添加动作项,然后在需要使用动作条的活动中实现 onCreateOptionsMenu() 将菜单资源添加到动作条。
    先说在不使用 v7 支持库时,也就是活动继承自 Activity 类 而不是
    ActionBarActivity 类(应该已经弃用转而用 AppCompatActivity类替代,可以参照http://blog.csdn.net/qq_32736689/article/details/50753687)。


    使用带有动作条的主题

    如果在API 11或更高级别上运行,可以应用主题 Theme.Holo 或它的某个子类来增加动作条(可以在Android R.style参考文档中找到 Android 内置主题的完整列表:http://developer.android.com/reference/android/R.style.html

    勾选 Backwards Compatibility选项,活动将继承 AppCompatActivity 类,否则,将继承Activity 类

    确保活动继承自 Activity 类。
    在 AndroidManifest.xml 中应用主题。

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.lim.bitsandpizzas">
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"  // 应用的图标
            android:label="@string/app_name"    // 用户友好的主题名
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">  // 主题
            <activity android:name=".MainActivity"
                android:label="@string/app_name" >  // 用户友好的活动名
                ...
            </activity>
        </application>
    </manifest>
    

    在样式资源文件中定义样式:

    <resources>
        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> // AS 默认提供了一个主题 
                      // 可自行修改为 android:Theme.Holo.Light 或其他支持ActionBar 的主题
            <!-- Customize your theme here. -->
        </style>
    </resources>
    

    创建菜单资源并将其添加到活动

    (如果 AS 没有为你创建的话)创建 app/src/main/res/menu 文件夹,所有的菜单资源都放在这个文件夹下。创建 menu_mian.xml 。

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:app="http://schemas.android.com/apk/res-auto"  // 如果不使用v7支持库,这条属性可以省略
        xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:id="@+id/action"
            android:title="action"
            android:orderInCategory="1"
            android:showAsAction="ifRoom" />
    </menu>
    

    每个菜单资源文件都有一个根元素 <menu>。使用 <item> 元素为菜单增加动作项。
    <item> 常见的属性:

    andorid:id 为动作指定一个唯一的 ID。必须有 ID 才能在活动代码中引用这个动作项。
    android:icon 动作项的图标。这是一个 drawable 或 mipmap 资源
    android:title 动作项的文本。如果一个一个动作项有一个图标,但是动作条上没有足够的空间同时显示动作项和图标,可能不会显示这个文本。若果这个动作项出现在动作条的溢出区,就只会显示文本。
    android:orderInCategory 这是个整数值,可以帮助 Android 确定动作项在动作条中出现的顺序。

    菜单 showAsAction 属性,用于指示是否希望这一项出现在动作条中。

    "ifRoom" 如果有空间将这个菜单项放在动作条中,否则,放在溢出区
    "withText" 包含这个菜单项的标题文本
    "never" 将这一项放在溢出区,不要放在主动作条中
    "always" 总是把这一项放在主动作条中。如果很多项都应用这个值,他们可能会重叠

    在要添加菜单项的 Activity 中实现 onCreateOptionsMenu() 方法在活动中填充菜单。

     @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action if it is present.
            getMenuInflater().inflate(R.menu.menu_main, menu);
            MenuItem menuItem = menu.findItem(R.id.action_share);
            return super.onCreateOptionsMenu(menu);
        }
    

    onOptionsItemSelected() 方法响应动作项单击。

    public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case R.id.action_name1:
                   // code to run when the action1 item is clicked
                case R.id.action_name2:
                   // code to run when the action2 item is clicked
                    default:
                        return super.onOptionsItemSelected(item);
            }
        }
    

    以上是添加动作条的基本内容。而如果你的 Activity 是扩展自 AppCompatAvtivity 类,或者说只要你在 App 中使用 v7 支持库,在 menu 资源文件中 showAsAction 属性的前缀就要写成 app,即 app:showAsAction="value" ( value 是上面showAsAction 值 ),而且 xmlns:app="http://schemas.android.com/apk/res-auto"属性不可省略。如果使用 v7 支持库,最好让活动扩展自 AppCompatActivity 类,因为在使用 v7 支持库而让活动扩展自 Activity 类时,在使用 ShareActionProvider 时会出现错误。


    下面说一下在动作项中使用 ShareActionProvider (共享动作提供者)。ShareActionProvider 允许用户与其他应用共享应用中的内容,它会定义自己的图标,我们不需要自行添加。单击图标时会提供一个可用于共享的应用列表。
    让 ShareActionProvider 共享内容,需要为它传递一个 Intent 。

    依旧是不使用 v7 支持库时:
    在菜单资源文件中添加一个 <item> 。

    <item android:id="@+id/action_share"
            android:title="share"
            android:orderInCategory="2"
            android:actionProviderClass="android.widget.ShareActionProvider"
            android:showAsAction="ifRoom" />
    

    在活动代码中 增加一个 android.weight.ShareActionProvider 类型的私有变量 shareActionProvider,在 onCreateOptionsMenu() 方法中增加设置 shareActionProvider 的代码:

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu_main, menu);
            MenuItem menuItem = menu.findItem(R.id.action_share);
            shareActionProvider = (ShareActionProvider) menuItem.getActionProvider();
            setIntent("text");
            return super.onCreateOptionsMenu(menu);
        }
    
        public void setIntent(String text) {
            Intent intent = new Intent(Intent.ACTION_SEND);
            intent.setType("text/plain");
            intent.putExtra(Intent.EXTRA_TEXT, text);
            shareActionProvider.setShareIntent(intent);
        }
    

    如果使用 v7 支持库,在声明 ShareActionProvider 时,必须要用到 android.support.v7.widget.ShareActionProvider,即菜单资源文件中的声明是
    app:android.support.v7.widget.ShareActionProvider, 同时 showAsAction 属性的前缀也必须改成 app,即 app:showAsAction 。事实上,这些 AS 都会给出错误提示而且支持快速改正。活动代码中的 ShareActionProvider 也必须改成导入 android.support.v7.widget.ShareActionProvider,在 onCreateOptionsMenu() 方法中获取 shareActionProvider 对象的语句也应该改成 shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menuItem)。使用 MenuItemCompat 需要导入 import android.support.v4.view.MenuItemCompat 包。

    // ShareActionProvider 动作项的声明
    <item android:id="@+id/action_share"
            android:title="@string/action_share"
            android:orderInCategory="2"
            app:showAsAction="ifRoom"
            app:actionProviderClass="android.support.v7.widget.ShareActionProvider" />
    
     @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflater the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.menu_main, menu);
            MenuItem menuItem = menu.findItem(R.id.action_share);
            // 更新后的语句
            shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menuItem);
            setIntent("This is example text");
            return super.onCreateOptionsMenu(menu);
        }
    

    在使用 v7 支持包里的扩展之后,Activity 也必须扩展 AppcompatActivity 类,这就是为什么前面说如果使用 v7 支持,就最好直接扩展 AppCompatActivity 而不是 Activity。因为在具体使用中,如果使用了 v7 支持包的组件而活动却扩展 Activity 类,虽然编码时不会提示错误,但是在运行时 ShareActionProvider.setShareIntent() 方法会抛出 NullPointerException 。原因我还不知道。


    支持向上导航

    为活动设置父活动,并在子活动的 onCreate() 方法中启用向上导航键就可以了(为活动增加抽屉时还会用到这个导航键,这里不表)。
    设置活动的父活动:在 Andriodmanifest.xml 文件中为子活动增加如下设置

    <activity android:name=".ChildActivity"
                android:label="ActivityName"
                android:parentActivityName=".MainActivity"> // 支持 API 16 以上的应用会使用这行代码指定父活动
                // 只有支持 API 16 以下的应用时才需要 <meta-data> 元素。包含这个元素也没什么坏处
                <meta-data android:name="android.support.PARENT_ACTIVITY"
                    android:value=".MainActivity" />
            </activity>
    

    ChildActivityonCreate() 方法中增加如下代码以启动向上导航键

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_child);
            // 下面两行用于启用导航键
            ActionBar actionBar  = getSupportActionBar();
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
    

    相关文章

      网友评论

          本文标题:使用动作条(Head First 学习笔记)

          本文链接:https://www.haomeiwen.com/subject/jgftgxtx.html