web-dev-qa-db-ja.com

app:showAsActionが表示されていないアイテム

なぜ間違っていて互換性がないのか理解できない

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <item Android:id="@+id/action_search"
      Android:title="@string/action_search"
      Android:icon="@drawable/search"
      Android:showAsAction="always" />
</menu>

完璧に動作しますが、適切で互換性のあるバージョンのように

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:app="http://schemas.Android.com/apk/res-auto" >
    <item Android:id="@+id/action_search"
          Android:title="@string/action_search"
          Android:icon="@drawable/search"
          app:showAsAction="always" />
</menu>

アイコンがまったく表示されません。

Samsung GT P5210(Android v。4.4.2)およびNexus 7(4.4.4)でテストしています

30
ITurchenko

アクションバーを使用するときに常に確認する必要があるのは

1)ActionBarActivityの代わりにActivityを拡張します

public class MainMenu extends ActionBarActivity{

2)正しいスタイルがマニフェストで定義されているように選択されている

マニフェスト

<application
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/AppTheme" >

スタイル

    <style name="AppTheme"
    parent="Theme.AppCompat.Light.DarkActionBar">
    </style>

3)showAsActionの-​​右のタイトルを選択します

  <menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
  xmlns:**yourapp**="http://schemas.Android.com/apk/res-auto" >
  <item Android:id="@+id/action_search"
      Android:icon="@drawable/ic_action_search"
      Android:title="@string/action_search"
      **yourapp**:showAsAction="ifRoom"  />
    ...
  </menu>

これはほとんどの人が間違っているものです

4)MenuActivityを定義します

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu items for use in the action bar
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_activity_actions, menu);
    return super.onCreateOptionsMenu(menu);
}

次のすべてを実行すると、アクションバーが機能するはずです。

次に、すべてのポジションにonClickListenerを追加する必要があります...

56
marduc812

私はちょうどあなたの質問を読み直し、あなたの問題が完全に正反対であることを見ました(しかし私の古い答えの一部はあなたの問題にまだ当てはまります)ので、ここに更新された答えがあります:

更新:

Gradleファイルにappcompatライブラリをインポートしましたが、APIレベル11または14より新しいデバイスのみをサポートしているようですか?この場合、lintチェックは、gradleを介してappcompatライブラリをインポートしたことを確認し、ライブラリのインポートのためにActionBarActivityを使用する必要があると考えます。そのため、エラーが発生します。ただし、Android:showAsAction属性が機能しているため、ネイティブのActivityを使用しているため、lintチェックで間違っていると言われても、ネイティブ属性の呼び出しは正しいです。したがって、lintエラーを削除する場合は、現在のテーマがappcompatテーマに依存している可能性があるため、gradleファイルからappcompat libを削除し、アクティビティテーマをネイティブのHolo Lightテーマに変更する必要があります。

なぜapp名前空間で動作しないのかという答えは、ネイティブのそれぞれのライブラリコードのXML属性の読み込みにあり、これは古い答えで処理されます。

古い答え

サポートライブラリのActionBarActivityを使用してAPIレベル11よりも低いデバイスに到達する場合、ここでの主な問題は、ActionBarActivityがネイティブのAndroid独自のスコープ内のAndroid:showAsActionなどのXML属性は、次のように定義します。

xmlns:app="http://schemas.Android.com/apk/res-auto"

そして、app:名前空間の同じ属性(ここではshowAsAction)でそれらにアクセスします。したがって、ActionBarActivityは、app名前空間ではなくAndroid名前空間でのみ検索するため、ネイティブのAndroid:showAsAction属性を表示または到達できません。

ネイティブ属性を使用する場合は、APIレベル11以降でのみサポートされているホロテーマでネイティブActivityを使用する必要があります。

16
blackfizz

addthis:

yourapp:showAsAction="ifRoom"

または

Android:showAsAction

例:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:yourapp="http://schemas.Android.com/apk/res-auto" >
    <item Android:id="@+id/action_search"
          Android:icon="@drawable/ic_action_search"
          Android:title="@string/action_search"
          yourapp:showAsAction="ifRoom"  />

</menu>

およびActivity:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu items for use in the action bar
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_activity_actions, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    switch (item.getItemId()) {
        case R.id.action_search:
            openSearch();
            return true;
        case R.id.action_compose:
            composeMessage();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

そして続きを読むここ

4
MilanNz