Подтвердить что ты не робот

Android: как программно установить тему активности в Theme.Dialog

Итак, у меня есть Activity (скажем TestActivity), который должен действовать как обычный unthemed 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. Но есть сильное чувство, что это можно сделать.

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

4b9b3361

Ответ 1

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

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

Решение:

  • Определите свою активность в AndroidManifest.xml с темой @android:style/Theme.Dialog
  • В вашем соответствующем файле .Java проверьте наличие intent extra, определяющего режим dialog.
  • Если он не существует, установите Theme в android.R.style.Theme. Это значение по умолчанию Theme, которое применяется, если вы не определяете какую-либо тему.

Код:

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

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

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

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

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

    @Override
    public int getCount() { return 1; }
    
  • В функции 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, изолирована от мест, где она используется в качестве диалога.

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

Ответ 2

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

Ответ 3

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

Ответ 4

Вызовите Activity.setTheme() в onCreate() перед тем, как позвонить setContentView().

Ответ 5

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

Ответ 6

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

Theme.Holo.DialogWhenLarge

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

Ответ 7

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

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

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

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

Ответ 8

setTheme(android.R.style.Theme_Dialog);

Ответ 9

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

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

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);
}