it-swarm.com.ru

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. Определите свою активность в вашем AndroidManifest.xml с темой @Android:style/Theme.Dialog
  2. В соответствующем файле .Java проверьте наличие дополнительного intent, который определяет режим dialog
  3. Если он не существует, установите Theme в Android.R.style.Theme. Это theme по умолчанию, который применяется, если вы не определили тему.

Код:

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

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

Альтернативное решение:

Более сложным решением является использование AlertDialog, как показано ниже:

  1. Определите класс ListAdapter, расширенный от ArrayAdapter
  2. вернуть 1 в функцию getCount

    @Override
    public int getCount() { return 1; }
    
  3. В функции getViewinflatelayout требуемой activity и выполните любую настройку перед возвратом 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, это может быть вариант.

Единственной причиной для рассмотрения этого решения может быть то, что логика для его отображения в dialog изолирована от мест, где оно используется в качестве диалога.

Оба варианта работали для меня, но по понятным причинам я выбираю первый вариант. :-)

53
Deepak G M

вы можете использовать setTheme(..) перед вызовом setContentView(...) и super.oncreate(), и он должен работать нормально

45
Ahmed Salem

Как и некоторые другие, вызовы setTheme в onCreate (до или после моего вызова 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

используйте setTheme перед вызовом super.onCreate(savedInstance)

3
Mohammad Abu Hmead

Вызов библиотеки тем по умолчанию:

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

В моем случае я использовал AppCompat Theme, поэтому убедитесь, что в вашем идентификаторе вы указали правильную библиотеку (т.е.):

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

0
Victor R. Oliveira

Это может быть неприменимо в вашей ситуации, но вы можете использовать тему:

Theme.Holo.DialogWhenLarge

и он будет отображать вашу активность в виде диалога, когда экран большой, и как обычную активность, когда экран маленький . Это описано в документации Android по Dialogs , а также содержит информацию о программировании диалога который также может Sun как полноэкранный фрагмент.

0
Xebozone