web-dev-qa-db-ja.com

Android:アクティビティのテーマをプログラムでTheme.Dialogに設定する方法

だから、Activity(たとえばTestActivity)があり、これは通常のテーマのないActivityおよびTheme.Dialog他の場所。両方のタスクで同じTestActivityを再利用しようとしています。

テーマを動的に設定することを探しています。コードは簡単です:黒の背景で動作する私のアクティビティのonCreateは次のとおりです。

public void onCreate(Bundle icicle) {
    if (Utility.isDialog == true)
        setTheme(Android.R.style.Theme_Dialog);
    super.onCreate(icicle);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
.....

ここにマニフェストエントリがあります

<activity Android:name=".TestActivity"/>

それまでの間、ここではできないという投稿を見つけました http://code.google.com/p/Android/issues/detail?id=4394 しかし、それができるという強い気持ちがあります。

すべての提案を歓迎します。

37
100rabh

この問題の回避策を提供したいと思います。

問題:ダイアログと全画面ベースの両方として同じアクティビティを使用する方法。

解決策:

  1. テーマ@Android:style/Theme.Dialogを使用して、AndroidManifest.xmlでアクティビティを定義します
  2. それぞれの.Javaファイルで、intentモードを定義するdialog extraを確認します。
  3. 存在しない場合は、ThemeAndroid.R.style.Themeに設定します。これはデフォルトのthemeで、テーマを定義しない場合に適用されます。

コード:

boolean fDialogMode = getIntent().hasExtra("dialog_mode");

if( ! fDialogMode ) {
    super.setTheme(Android.R.style.Theme);
}

代替ソリューション:

より複雑な解決策は、以下のようにAlertDialogを使用することです。

  1. ListAdapterから拡張されたArrayAdapterクラスを定義します。
  2. getCount関数の1を返します

    @Override
    public int getCount() { return 1; }
    
  3. getView関数で、必要なinflatelayoutactivityで、viewを返す前にカスタマイズを行います。

    @Override
    public View getView( int position, View view, ViewGroup group ) {
        View v = view;
        if( v == null ) {
            v = getSystemService(Context.LAYOUT_INFLATER_SERVICE).inflate( <layout res id>, null );
        }
    
    ... Do any customization here    ....
    
          return v;
    }
    

activityclassであまり多くの処理を行っていない場合、これは間違いなく2番目の選択オプションです。

このソリューションを検討する唯一の理由は、dialogでそれを表示するロジックが、ダイアログとして使用される場所に隔離されていることです。

両方のオプションが機能しましたが、明らかな理由で最初のオプションを選択しています。 :-)

54
Deepak G M

setTheme(..)setContentView(...)を呼び出す前にsuper.oncreate()を使用できます。

45
Ahmed Salem

他のいくつかのように、onCreateでのsetThemeの呼び出し(super.onCreateの呼び出しの前後)は機能しませんでした。ただし、setThemeをオーバーライドすることで、Manifest.xmlに記載されているテーマ以外のテーマを指定することができました。具体的には、以下は問題なく機能しました。

@Override
public void setTheme(int resid) {
    boolean changeTheme = true;
    super.setTheme(changeTheme ? Android.R.style.Theme_Dialog : resid);
}

次のディスカッションで上記を見つけました: https://code.google.com/p/Android/issues/detail?id=4394

11
user3570982

Activity.setTheme()を呼び出す前に、onCreate()setContentView() を呼び出します。

10
Reuben Scratton

super.onCreate(savedInstance)を呼び出す前にsetThemeを使用します

3

デフォルトのテーマライブラリ呼び出し:

super.setTheme(Android.R.style.Theme);

私の場合、私はAppCompatテーマを使用していたので、IDで適切なライブラリ(つまり)を参照していることを確認してください:

super.setTheme(Android.support.v7.appcompat.R.style.Theme_AppCompat_NoActionBar);
0

これはあなたの状況には当てはまらないかもしれませんが、テーマを使用できます:

Theme.Holo.DialogWhenLarge

また、画面が大きい場合はアクティビティをダイアログとして表示し、画面が小さい場合は通常のアクティビティとして表示します。これはAndroid Dialogs のドキュメントで説明されています。また、Sunをフルスクリーンフラグメントとして使用できるDialogのプログラミングに関する情報も含まれています。

0
Xebozone