4

開発ドキュメントに示されているように、プログラムでアクション バーを追加しようとしていますが、エラーが発生しています。私の minSdk は 11 に設定されています。私のアプリケーションには 1 つのレイアウトと 1 つのアクティビティがあり、アクティビティ内の唯一のコードは次のとおりです。

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.inbox);
    ActionBar actionBar = getActionBar();
    actionBar.show();

}

最後の 2 行を削除すると、アプリが実行されます。ホロテーマにアクションバーが自動的に含まれることは知っていますが、editTextビューが好きではありません。なぜこれが起こっているのかについてのアイデア。HoloThemeビューを別の方法で使用してテーマを設定する必要がありますか?

繰り返しますが、日食でエラーは発生しません。私のプログラムは、logcat からヌル ポインター例外として解読できるものからクラッシュしています。

4

3 に答える 3

12

リンク先のドキュメントから:

アクション バーを削除したいカスタム アクティビティ テーマがある場合は、android:windowActionBarstyle プロパティをに設定しfalseます。ただし、テーマを使用してアクション バーを削除すると、ウィンドウはアクション バーをまったく許可しないため、後で追加することはできません。呼び出しgetActionBar()は を返しnullます。

アクションバーのないテーマを使用しているため、getACtionBar()が返され、そのnullを呼び出そうとすると、例外がスローされます。show()null

それで、あなたが得ているエラーを説明します。それについて何をすべきかについては、ActionBar のドキュメントには次のように書かれています。

Android 3.0 (API レベル 11) 以降では、アクティビティがシステムの Holo テーマ (またはその子孫テーマの 1 つ) (デフォルト) を使用している場合、アクティビティのウィンドウの上部にアクション バーが表示されます。それ以外の場合は、プロパティを使用してカスタム テーマで呼び出すrequestFeature(FEATURE_ACTION_BAR)か宣言することで、アクション バーを追加できwindowActionBarます。

これにより、Holo テーマを使用せずに ActionBar を作成するための 2 つの簡単なオプションが提供されます。これはおそらくあなたの場合最も簡単です:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR); // Add this line
    setContentView(R.layout.inbox);
    ActionBar actionBar = getActionBar();
    actionBar.show();
}

更新: ActionBar が機能しTheme.Blackなくなるため、パーツなしに切り替える必要もあります。NoTitleBar

于 2012-07-08T01:17:47.983 に答える
10

私は同じ問題に遭遇しました。私は最終的に合理的な解決策を思いつきました。私は 11 のターゲット API を持つ最小 API バージョン 8 を持っています。ホロ スタイルも好きではないので、次のようにスタイルをオーバーライドします。

まず、「res/values-v11」フォルダーを作成する必要があります。おそらく、既に「values」フォルダーがあるので、同じレベルで「values-v11」を作成するだけです (ターゲット API レベルが何であるかは関係ありません...「values-v11」を使用します)。

それが作成されたら、各フォルダーにテーマを含む XML ドキュメントを作成します。元の値フォルダーは、android 3.0 (< api 11) 未満のすべてに使用されます。テーマは次のようになります。

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

    <style name="Theme.Black.OptionalActionBar" parent="@android:style/Theme.Black.NoTitleBar">
        <item name="android:windowNoTitle">True</item>
        <item name="android:windowActionBar">False</item>
    </style>

    <style name="OptionalVisibility">
        <item name="android:visibility">visible</item>
    </style>

</resources>

Holoテーマを使用していないことに注意してください。代わりに、Theme.Black.NoTitleBarテーマを親として使用しています。そこから、API 11 よりも下位のウィンドウ タイトルとアクション バーを非表示にするオプションを設定しました。

次に、「values-v11」フォルダーに 2 つ目のテーマ ドキュメントを作成し、次のように設定します。

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

    <style name="Theme.Black.OptionalActionBar" parent="@android:style/Theme.Black.NoTitleBar">
        <item name="android:windowNoTitle">false</item>
        <item name="android:windowActionBar">true</item>
        <item name="android:actionBarStyle">@android:style/Widget.Holo.ActionBar</item>
    </style>

    <style name="OptionalVisibility">
        <item name="android:visibility">invisible</item>
        <item name="android:height">1dp</item>
    </style>

</resources>

上記のテーマでは、アクション バーを有効にし、 Holoテーマで設定しますが、他のすべての要素はそのままにします。そのため、アクション バーは「ホロ」のように見えますが、それ以外はすべて下位バージョンで表示されているとおりのままです (そして、ホロに付属する醜いテキスト エントリは表示されません)。

次に、マニフェストで、アクションバーを表示したい場合は、そのアクティビティのテーマをandroid:theme="@style/Theme.Black.OptionalActionBar"

私がこれを行ったのは、現在非推奨になっているハードウェア メニュー ボタンに依存してレイアウトに失敗したためです。上記のテーマを使用して、必要に応じてアクション バーを設定したり、古いデバイスの場合はメニューとして残したりできます。次に、2.0 から 4.0 までをシームレスにサポートするために、メニュー作成メソッドに 1 つのプロパティを設定するだけです。

いずれにせよ、これが必要な場所に到達するかどうかを確認してください。

私の考えでは、アクションバーをリクエストしたり、コードで何かをしたりすることを覚えておく必要がないため、他のアプローチよりもはるかに簡単です。アクティビティにテーマを設定するだけで、すぐに始められます。

于 2012-08-26T22:59:01.450 に答える
7

ダルシャンが言ったこと...

もう少し先に進むには、ActionBarSherlockをチェックします。サポートライブラリと組み合わせて、2.x+であるほとんどすべてのバージョンのAndroidにアクションバーを追加できます。

フルスクリーン/タイトルバーなしを取得するには、ABSテーマのいずれかから独自のテーマを作成します。

<style name="Theme.MY.Sherlock.Fullscreen" parent="Theme.Sherlock.Light.DarkActionBar">
        <item name="android:windowFullscreen">true</item>;
 </style>

そのテーマをonCreateに適用してから、アクションバーを表示するのは同じなので(ABSサポートプレフィックスを使用する場合を除く)、基本的に

setTheme(R.style.Theme_MY_Sherlock_Fullscreen);
setContentView(R.layout.mylayout);
getSupportActionBar.Show();

ABSは機能的にはほとんど重複しているため(ソースの多く、ABSはほとんどラッパークラスです)、標準のアクションバーでも同じことができると思います(ホロテーマをベースとして使用)。 14以降でネイティブ実装を使用します(11とその中間にはいくつかの不足している機能/修正があります)

ここでABSを見ることができ、彼はそれをJBに更新したようです

--valuesの下のresourcesフォルダーに、themes.xmlファイル(/res/values/themes.xml)を作成します。

次に、これをそこに入れて上記を試してみてください。ただし、もちろんsetTheme(名前をTheme_My_Holo_FullScreenに置き換え、getSupportActionbar()プレフィックスを使用しないでください。ネイティブ実装を使用する必要はありませんが、同じように機能するはずです。

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <style name="Theme.My.Holo.Fullscreen" parent="Theme.Holo">
        <item name="android:windowFullscreen">true</item>;
    </style>

</resources>
于 2012-07-08T01:40:10.153 に答える