2

私はActionBarSherlock (ABS)を使用しており、プロジェクトが提供するABS Demos Sampleアプリケーションで確認できるように、アプリケーションにダイアログを追加したいと考えています。ダイアログのサンプルは次のようになります。

ActionBarSherlock ダイアログ

自分でアクティビティを作成しました。関連するソースコードは次のとおりです。

public class Dialog extends SherlockActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.Sherlock___Theme_DarkActionBar);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dialog);
    }
}

setTheme()ABSサンプルはこれを行いませんが、何らかの理由でAndroidは私に追加を強制します. 省略すると、次のエラーが発生します。

java.lang.IllegalStateException: You must use Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar, or a derivative.

MyAndroidManifest.xmlには次の設定があり、ABS サンプルのものと非常によく似ています。

<activity
    android:name=".activities.Dialog"
    android:label="@string/title_activity_dialog"
    android:theme="@style/Theme.Sherlock.Dialog" >
</activity>

次のスクリーンショットは、私のダイアログ アクティビティがどのように見えるかを示しています。

カスタム ダイアログ

マップをサポートする ActionBarSherlock 4.1.0、Android サポート ライブラリ v4 を使用しています。

質問:なぜそんなに違うように見えるのか分かりますか?

  • 暗いユーザー インターフェイスと明るいユーザー インターフェイス
  • 透明な背景と不透明な背景
  • アクションバーあり/なし

アップデート:

ABS サンプルは、次のようにダイアログ アクティビティを開始します。

protected void onListItemClick(ListView l, View v, int position, long id) {
    Map<String, Object> map = (Map<String, Object>)l.getItemAtPosition(position);
    Intent intent = (Intent) map.get("intent");
    startActivity(intent);
}

次のようにダイアログ アクティビティを開始します。

public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(R.string.title_menuItemDialogActivtiy)
        .setIcon(R.drawable.ic_action_dialog)
        .setIntent(new Intent(this, Dialog.class))
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    return true;
}

一方、このパターン非推奨であることがわかりました。代わりに、DialogFragmentを使用できます。ここで発生する質問: フラグメントをアクション メニュー項目と統合するにはどうすればよいですか?


代替ソリューション:

より「将来的に安全」であると推定されるため、 のDialogFragment代わりにa を使用することにしました。Activity私は基本的に、非常に有益なチュートリアルUsing DialogFragments (2012 年 6 月 3 日投稿)に従いました。さらに、関連する有用な投稿を追加したいと思います。

4

2 に答える 2

4

あなたが見ている出力は間違いなくJavaコードでテーマを設定することから来ています(これはXMLで設定された値を上書きします)。次のサンプルアプリケーション(文字通りこれですべてです)を立ち上げ、追加のsetTheme()呼び出しを追加して問題を再現しました。

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".Dialog"
        android:theme="@style/Theme.Sherlock.Dialog">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

そしてダイアログ...

public class Dialog extends SherlockActivity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView text = new TextView(this);
        text.setText("This is a dialog!");

        setContentView(text);
    }
}

その余分なメソッドなしで例外が発生した理由については、別の問題です(そして非常に奇妙です)。ご覧のとおり、上記で提供したのと同じくらい少ないコードで動作するはずです。

おそらく、ライブラリプロジェクトとプロジェクトの両方が少なくともAndroid 4.0(API 14)でコンパイルされていることを確認してください。これは、ライブラリの要件です。

それを超えて、アプリケーションでダイアログを表示したいだけの場合、それはテーマ別のアクティビティである必要がありますか?これは一般的ではありません。Dialog表示する単純またはAlertDialogサブクラスを いつでも作成できます。詳細については、こちらをご覧ください...

于 2012-08-13T16:03:28.750 に答える
1

アプリケーションのテーマを設定してみてください。

<application
    android:theme="@style/Theme.Sherlock"

ダイアログはテーマを継承する必要があります。すでに設定している場合は、アクティビティ宣言の android:theme タグと setTheme() 呼び出しを削除して、何が起こるかを確認してください。setTheme なしでエラーが発生する理由は、SherlockActivities がエラー メッセージにテーマの 1 つを持っている必要があり、問題が発生する前にマニフェスト setTheme() でそれをオーバーライドしたためです。

于 2012-08-13T14:00:57.893 に答える