操作栏项目始终显示在溢出菜单中。

9
我正在尝试在操作栏中添加操作项,但即使有很多空间,这些项始终会添加到溢出列表中。有什么建议可以解决这个问题吗?

enter image description here

这应该是这样的

enter image description here

main.xml

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

    <item
        android:id="@+id/action_refresh"
        android:icon="@drawable/ic_action_refresh"
        android:showAsAction="ifRoom"
        android:title="@string/action_refresh" />

    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search"
        android:showAsAction="ifRoom"
        android:title="@string/action_search" />

    <item
        android:id="@+id/action_settings"
        android:title="@string/action_settings"
        app:showAsAction="never" />


</menu>

MainActivity.java

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.actionbardemo.app" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.actionbardemo.app.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>

</manifest>

build.gradle

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.3"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile 'com.android.support:support-v4:19.0.1'
    compile 'com.android.support:appcompat-v7:19.0.1'
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

如果没有足够的空间,它将出现在溢出菜单中。看起来有足够的空间,但实际上并没有。 - Raghunandan
@Raghunandan,这就是我在这里提问的原因。 - N Sharma
阅读此链接:http://developer.android.com/guide/topics/ui/actionbar.html - Raghunandan
@Raghunandan 我已经阅读了,但我无法追踪到我的问题。 - N Sharma
1
@Williams 另一件事是,你的最小 SDK 版本是 8。因此,你需要 xmlns:yourapp="http://schemas.android.com/apk/res-auto"yourapp:showAsAction="ifRoom" - Raghunandan
显示剩余5条评论
7个回答

8

我的应用程序使用支持库以确保与Android 2.2及更低版本的兼容性,因此我必须定义自己的XML命名空间并将该命名空间用作属性前缀。

问题的解决方法是,我写了android:showAsAction="ifRoom",但我应该写app:showAsAction="ifRoom"

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

    <item
        android:id="@+id/action_refresh"
        android:icon="@drawable/ic_action_refresh"
        app:showAsAction="ifRoom"
        android:title="@string/action_refresh" />

    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search"
        app:showAsAction="ifRoom"
        android:title="@string/action_search" />

    <item
        android:id="@+id/action_settings"
        android:title="@string/action_settings"
        app:showAsAction="never" />


</menu>

这是因为您的最小SDK版本为8,并且您使用AppCompat来支持API级别低于11的操作栏。请在您的帖子中提到原因。 - Raghunandan

5
在菜单的xml文件中,您需要像下面这样添加yourapp:showAsAction="always"。
<item
    android:id="@+id/Option"
    android:actionProviderClass="android.support.v7.widget.ShareActionProvider"
    android:icon="@drawable/ic_action_settings"
    android:title="Option"
    yourapp:showAsAction="always"/>

<item
    android:id="@+id/Save"
    android:actionProviderClass="android.support.v7.widget.ShareActionProvider"
    android:icon="@drawable/ic_action_save"
    android:title="Save"
    yourapp:showAsAction="always"/>


你使用的ActionBar是v4还是AppCompat? - PankajAndroid
2
@PankajAndroid,“always”不被推荐,而“ifroom”更好,让操作系统决定。 - Zohra Khan
@ZohraKhan 我使用了appcomct,它运行良好。但我只添加了两个项目。 - PankajAndroid
@PankajAndroid 'com.android.support:appcompat-v7:19.0.1' - N Sharma
是的,看起来很有帮助 +1 - N Sharma
显示剩余2条评论

4
根据文档,如果您的应用程序使用支持库以兼容Android 2.1及以下版本,则android:命名空间中不提供showAsAction属性。相反,此属性由支持库提供,您必须定义自己的XML命名空间并将该命名空间用作属性前缀。(自定义XML命名空间应基于您的应用程序名称,但它可以是任何名称,并且仅在声明它的文件的范围内可访问。)例如:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
    <!-- Search, should appear as action button -->
    <item android:id="@+id/action_search"
          android:icon="@drawable/ic_action_search"
          android:title="@string/action_search"
          yourapp:showAsAction="ifRoom"  />
    ...
</menu>

2

试试这个:

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

<item
    android:id="@+id/action_refresh"
    android:icon="@drawable/ic_action_refresh"
    app:showAsAction="ifRoom"
    android:title="@string/action_refresh" />

<item
    android:id="@+id/action_search"
    android:icon="@drawable/ic_action_search"
    app:showAsAction="ifRoom"
    android:title="@string/action_search" />

<item
    android:id="@+id/action_settings"
    android:title="@string/action_settings"
    app:showAsAction="never" />


1
如果您想始终在操作栏中显示所有项目,则可以按照以下方式制作菜单xml文件:

<item
    android:id="@+id/action_refresh"
    android:icon="@drawable/ic_action_refresh"
    app:showAsAction="always"
    android:title="@string/action_refresh" />

<item
    android:id="@+id/action_search"
    android:icon="@drawable/ic_action_search"
    app:showAsAction="always"
    android:title="@string/action_search" />

<item
    android:id="@+id/action_settings"
    android:title="@string/action_settings"
    app:showAsAction="always" />


我也试过这个,但问题仍然存在,在那里已经有地方了,不需要总是使用所有时间。 - N Sharma
这意味着没有空格 - Sagar Maiyad

0

我之前遇到过类似的问题,你可以试试这个方法

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

<item
    android:id="@+id/action_refresh"
    app:showAsAction="never"
    android:title="@string/action_refresh" />

<item
    android:id="@+id/action_search"
    app:showAsAction="never"
    android:title="@string/action_search" />

<item
    android:id="@+id/action_settings"
    android:title="@string/action_settings"
    app:showAsAction="never" />


-4
尝试在菜单项中使用 android:showAsAction="always"

1
@AndroGeek 这是一个简短的回答,没有解释为什么它应该能够工作或者它基于什么理由,它只是一个“尝试”,而且显然它没有起作用。 - user289086

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