showAsAction =“always”在双窗格模式下不起作用

时间:2014-09-04 13:24:41

标签: java android android-layout android-fragments android-menu

我尝试将应用中的菜单项设置为app:showAsAction =“always”。当我使用相同的布局时,这适用于手机和平板电脑。

但是当我使用双窗格布局时,即使有足够的空间,项目也不会显示在操作栏中,而是显示在溢出菜单中。

这是菜单xml:

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

    <item
        android:id="@+id/menu_item_maps"
        android:icon="@drawable/ic_action_place"
        android:orderInCategory="20"
        android:title="@string/maps_menu_item"
        app:showAsAction="always">
    </item>
    <item
        android:id="@+id/menu_item_event"
        android:icon="@drawable/ic_action_event"
        android:orderInCategory="30"
        android:title="@string/menu_item_event"
        app:showAsAction="always">
    </item>
    <item
        android:id="@+id/menu_item_share_gig"
        android:orderInCategory="100"
        android:title="@string/menu_item_share"
        app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
        app:showAsAction="always">
    </item>

</menu>

这是双窗格布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:baselineAligned="false"
    android:divider="?android:attr/dividerHorizontal"
    android:orientation="horizontal"
    android:showDividers="middle"
     >

    <fragment
        android:id="@+id/gig_list"
        android:name="de.nobodyknows.app.GigListFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

    <FrameLayout
        android:id="@+id/gig_detail_container"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2" />

</LinearLayout>

在我的代码中,我使用回调方法将FrameLayout替换为详细信息片段:

/**
 * Callback method from {@link GigListFragment.Callbacks} indicating that
 * the item with the given ID was selected.
 */
@Override
public void onItemSelected(Long id) {
    if (mTwoPane) {
        // In two-pane mode, show the detail view in this activity by
        // adding or replacing the detail fragment using a
        // fragment transaction.
        Bundle arguments = new Bundle();
        arguments.putLong(GigDetailFragment.GIG_ID, id);
        GigDetailFragment fragment = new GigDetailFragment();
        fragment.setArguments(arguments);
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.gig_detail_container, fragment).commit();

    } else {
        // In single-pane mode, simply start the detail activity
        // for the selected item ID.
        Intent detailIntent = new Intent(this, GigDetailActivity.class);
        detailIntent.putExtra(GigDetailFragment.GIG_ID, id);
        startActivity(detailIntent);
    }
}

细节片段膨胀上面显示的选项菜单:

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.detail, menu);
    }

现在,当启动新的活动时,这些菜单项在电话布局中显示正常。但是当片段替换第一个活动中的FrameLayout时,菜单项只会显示在溢出菜单中。但我无法弄清楚为什么会这样。它与支持库有关吗?或者片段的工作原理是什么特别的?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

好的,我找到了解决方案。

我的活动未延长ActionBarActivity,因此未正确设置与MenuItemCompat一起使用。 它仍在手机上工作的原因是因为它在一个不同的活动中正确地扩展了ActionBarActivity

为了纠正这个问题,我只是将充当双窗格Activity的Activity的超类替换为ActionBarActivity