Android: Как программно установить тему Активности на Theme.Dialog - PullRequest
37 голосов
/ 11 февраля 2011

Итак, у меня есть 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. Но есть сильное чувство, что это можно сделать.

Все предложения приветствуются.

Ответы [ 9 ]

54 голосов
/ 23 мая 2011

Хотел бы обойти эту проблему.

Проблема: Как использовать то же действие, что и в диалоговом режиме, так и в полноэкранном режиме.

Решение:

  1. Определите свою активность в AndroidManifest.xml с темой @android:style/Theme.Dialog
  2. В соответствующем файле .Java проверьте наличие intent extra, определяющего режим 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. В функции getView, inflate layout из 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;
    }
    

Это определенно второй вариант, если вы не выполняете слишком много обработки в activity class, это может быть вариант.

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

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

45 голосов
/ 13 октября 2011

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

11 голосов
/ 26 апреля 2014

Как и некоторые другие, вызовы 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

10 голосов
/ 11 февраля 2011

Позвоните Activity.setTheme() в onCreate(), прежде чем позвонить setContentView().

3 голосов
/ 20 марта 2013

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

0 голосов
/ 19 ноября 2017

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

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

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

super.setTheme(android.support.v7.appcompat.R.style.Theme_AppCompat_NoActionBar);
0 голосов
/ 24 октября 2015

Я знаю, что опоздал, но я хотел бы опубликовать решение здесь:

Проверьте полный исходный код здесь .Это код, который я использовал при смене темы ...

SharedPreferences pref = PreferenceManager
       .getDefaultSharedPreferences(this);
String themeName = pref.getString("prefSyncFrequency3", "Theme1");
if (themeName.equals("Africa")) {
    setTheme(R.style.AppTheme);
} else if (themeName.equals("Colorful Beach")) {
    //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();
    setTheme(R.style.beach);
} else if (themeName.equals("Abstract")) {
    //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();
    setTheme(R.style.abstract2);
} else if (themeName.equals("Default")) {
    setTheme(R.style.defaulttheme);
}
0 голосов
/ 16 декабря 2014

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

Theme.Holo.DialogWhenLarge

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

0 голосов
/ 04 сентября 2013
setTheme(android.R.style.Theme_Dialog);
...