同时显示两个操作栏(底部和顶部)?

9
我需要制作两个操作栏,顺便提一下,我正在使用actionBarSherlock。所以我需要的是在正常的操作栏上放置一个“欢迎屏幕”开关,并添加两个普通的ActionBar操作选项。类似于我需要的是Gmail和Maps,如此处所示:http://cdn.androidcommunity.com/wp-content/uploads/2012/03/Screenshot_2012-03-28-12-58-16.png(由于我的声望不高,他们不允许我发布图片,请查看链接)。
这个地图应用程序有一个上部和底部的操作栏,正是我需要的,因为一旦我达到可以添加第二个操作栏的地步,我就知道从哪里开始...
我已经搜索了一个星期关于这个主题,找到了一些类似的问题,但是我并没有理解任何答案;答案都是关于自定义视图的,而我对此毫不熟悉,什么也看不懂。尽管如此,我试着从我认为正确的东西中制作了一个“自定义视图”,但是我得到了无法解决的错误...如果可能的话,请给我展示一下这个地图应用程序是如何使用这两个操作栏的?(我不想像在地图和Gmail中那样导航,只需要这两个操作栏)。
以下是我的一些代码:
//Part of my MainActivity.class
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
        MenuInflater inf = getSupportMenuInflater();
        inf.inflate(R.menu.upper_navbar, menu);

        final String name = "welcome";
        final SharedPreferences pref = getSharedPreferences(name, 0);
        final Editor edit = pref.edit();
        boolean oldState = pref.getBoolean("w", true);
        ToggleButton tog = (ToggleButton) menu.findItem(R.id.welcome_screen).getActionView();
        if(oldState){
            tog.setChecked(true);

        }else{
            tog.setChecked(false);
        }

        tog.setOnCheckedChangeListener(new OnCheckedChangeListener() {



            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked){
                    edit.putBoolean("w", true);
                    edit.apply();
                }else{
                    edit.putBoolean("w", false);
                    edit.apply();
                }


            }
        });
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

    return super.onOptionsItemSelected(item);
    }

我的清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="seaskyways.editpad"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="16" />

    <application
        android:allowBackup="true"
        android:name="android.app.Application"
        android:icon="@drawable/ic_launcher"
        android:uiOptions="splitActionBarWhenNarrow"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="seaskyways.editpad.MainActivity"
            android:label="MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="seaskyways.editpad.Splash"
            android:theme="@style/Theme.Sherlock.Dialog.NoActionBar"


            android:label="Splash" >
            <intent-filter>
                <action android:name="android.intent.action.SPLASH" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>

</manifest>

我打算将菜单放在操作栏中...

menu\activity_main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >


    <item android:id="@+id/bottom_copy"  android:title="Copy" android:orderInCategory="3" android:showAsAction="ifRoom|withText" />
    <item android:id="@+id/bottom_paste" android:title="Paste" android:orderInCategory="2" android:showAsAction="ifRoom|withText" />

</menu>

菜单\upper_navbar.xml(本应将其命名为upper_actionbar,但这只是一个思维错误,毕竟它只是一个名称:/请继续)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

     <item
        android:id="@+id/welcome_screen"
        android:orderInCategory="1"
        android:showAsAction="ifRoom|withText"
        android:title="Welcome Screen"
        android:actionLayout="@layout/toggle"

        />

</menu>

如果您需要更多信息,请告诉我,我会告诉大家,毕竟这是为了我和其他人! 编辑!!!:我找到了一个更接近我的问题的例子,wifi设置(http://omgdroid.com/wp-content/uploads/2012/07/Screenshot_2012-07-06-01-34-29-576x1024.png)它在普通操作栏中使用一个开关和一个普通的分割操作栏!正是我所需要的! 编辑2!!!:这是我Galaxy nexus的屏幕截图,使用基于aosp的自定义ROM,这正是我需要和意思:

设置-Wifi:https://lh4.googleusercontent.com/-aeL_sHjIcQQ/UPVptGQiuqI/AAAAAAAAAGE/UGc-CuLP4Qw/s512/Screenshot_2013-01-15-16-36-32.png

设置-蓝牙:lh3*googleusercontent.com/-4j6ca1Nm1VI/UPVqAiDn_PI/AAAAAAAAAGM/LLB2ILWVjQY/s512/Screenshot_2013-01-15-16-38-14.png

编辑3 !!! :在我的蓝牙和Wifi调查中取得了很大进展,并且正如我所说并询问的那样,它们是真正的操作栏!看看我在设置-蓝牙中得到的内容:

BluetoothSettings.class/onCreateOptionsMenu :

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        if (mLocalAdapter == null) return;
        boolean bluetoothIsEnabled = mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_ON;
        boolean isDiscovering = mLocalAdapter.isDiscovering();
        int textId = isDiscovering ? R.string.bluetooth_searching_for_devices :
            R.string.bluetooth_search_for_devices;
        menu.add(Menu.NONE, MENU_ID_SCAN, 0, textId)
                .setEnabled(bluetoothIsEnabled && !isDiscovering)
                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
        menu.add(Menu.NONE, MENU_ID_RENAME_DEVICE, 0, R.string.bluetooth_rename_device)
                .setEnabled(bluetoothIsEnabled)
                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
        menu.add(Menu.NONE, MENU_ID_VISIBILITY_TIMEOUT, 0, R.string.bluetooth_visibility_timeout)
                .setEnabled(bluetoothIsEnabled)
                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
        menu.add(Menu.NONE, MENU_ID_SHOW_RECEIVED, 0, R.string.bluetooth_show_received_files)
                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
        super.onCreateOptionsMenu(menu, inflater);
    }

这些选项可以在splitActionBarDown中清晰显示,具有准确的属性。
现在:
BluetoothSettings.class / addPreferencesForActivity:
@Override
    void addPreferencesForActivity() {
        addPreferencesFromResource(R.xml.bluetooth_settings);

        Activity activity = getActivity();

        Switch actionBarSwitch = new Switch(activity);

        if (activity instanceof PreferenceActivity) {
            PreferenceActivity preferenceActivity = (PreferenceActivity) activity;
            if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) {
                final int padding = activity.getResources().getDimensionPixelSize(
                        R.dimen.action_bar_switch_padding);
                actionBarSwitch.setPadding(0, 0, padding, 0);
                activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
                        ActionBar.DISPLAY_SHOW_CUSTOM);
                activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams(
                        ActionBar.LayoutParams.WRAP_CONTENT,
                        ActionBar.LayoutParams.WRAP_CONTENT,
                        Gravity.CENTER_VERTICAL | Gravity.END));
            }
        }

        mBluetoothEnabler = new BluetoothEnabler(activity, actionBarSwitch);

        setHasOptionsMenu(true);
    }

注意,该类并未扩展 Activity,而是扩展了 DeviceListPreferenceFragment...

现在我们知道在同一时间内可以有两个操作栏(分割和普通),我们需要一种方法来简化它,也许通过一个类或库?

3个回答

5
那是一个分离式操作栏。它适用于屏幕宽度为400dp的手持设备。 要启用分离式操作栏,只需在您的<activity><application>清单元素中添加uiOptions="splitActionBarWhenNarrow"即可。
编辑: 第二张图片确实不是分离式操作栏。这些只是带有buttonBarButtonStyle属性的按钮。请查看此处编辑: splitActionBarWhenNarrow已被弃用

1
不,你没有读清问题,我知道如何制作一个操作栏(分割和普通),但我需要的是同时制作它们,这样我就可以拥有两个操作栏! - Seaskyways
3
@Seaskyways说:“其实,我怀疑Ahmad确实读了问题,因为他的答案是正确的。” - CommonsWare
这可能会在以后对我有所帮助,但它并没有回答我的问题 :/ 请查看第二次编辑,其中绝对是一个操作栏(上方为切换按钮,下方为分割操作栏)... - Seaskyways
你是指我编辑的链接吗?这不是分割操作栏。 - Ahmad
无法在底部看到操作栏 - Qutbuddin Bohra
@Qutbuddin,你看不懂吗?编辑明确说明它已经过时了。 - Ahmad

3

我需要创建两个操作栏

那么你需要自己解决了。除了分割操作栏(split action bar)之外,Android或ActionBarSherlock不支持此功能,而你似乎已经放弃了它。

我需要的类似于Gmail和Maps这样

那是一个分割操作栏,具体来说是使用叠加层的操作栏。这个示例项目演示了这种技术。

这个地图应用程序有上下两个操作栏,正是我所需要的

那么使用分割操作栏,通过在<activity>元素中使用android:uiOptions="splitActionBarWhenNarrow"来实现,就像地图一样。主地图活动使用android:uiOptions="splitActionBarWhenNarrow"

如果可能,请给我展示一下这个地图应用程序如何使用这两个操作栏作为例子?

如上所述,这个示例项目演示了这种技术。

我知道如何制作一个动作栏(分割和普通)。
地图使用分割动作栏。
但我需要同时制作它们,这样我就可以有两个动作栏!
在您的屏幕截图中,您会注意到地图具有分割动作栏,并且它们同时显示在屏幕上。这是分割动作栏在狭窄情况下的工作方式。当屏幕不太窄时,同一地图应用程序不会显示分割动作栏。

1
@Seaskyways:而且你的截图不是AOSP版本。这个屏幕的AOSP版本底部没有按钮,而是使用分割操作栏,在操作溢出中显示“扫描”和“高级”。 - CommonsWare
@Seaskyways:引用我之前的评论:“这个屏幕的AOSP版本底部没有按钮,而是使用了一个分割操作栏,在操作溢出中显示“扫描”和“高级”。” - CommonsWare
如何在标题旁边使用分割操作栏和开关?!?!?! - Seaskyways
我也考虑过调查,但是谷歌给我们提供了SDK,我在哪里可以找到源代码? - Seaskyways
@Seaskyways:http://source.android.com。同时还有一个GitHub镜像网站,地址为http://github.com/android。 - CommonsWare
显示剩余6条评论

-1

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="18" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"

//这是主要的代码行

    android:uiOptions="splitActionBarWhenNarrow"  




     >
    <activity
        android:name="com.example.androidactionbarbottam.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

这是底部的主要行

android:uiOptions="当窄屏幕时分离操作栏"


1
您可以在底部添加图像或文本......这将不会创建任何问题,我有同样的问题,我已经从这行代码中解决了。 - Amitsharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接