なぜ間違っていて互換性がないのか理解できない
<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)でテストしています
アクションバーを使用するときに常に確認する必要があるのは
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)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);
}
次のすべてを実行すると、アクションバーが機能するはずです。
次に、すべてのポジションにonClickListener
を追加する必要があります...
私はちょうどあなたの質問を読み直し、あなたの問題が完全に正反対であることを見ました(しかし私の古い答えの一部はあなたの問題にまだ当てはまります)ので、ここに更新された答えがあります:
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
を使用する必要があります。
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);
}
}
そして続きを読むここ