it-swarm-eu.dev

Android: Jak programově nastavit téma aktivity na Theme.Dialog

Takže mám Activity (říci TestActivity), který musí fungovat jako normální nemyslitelný Activity stejně jako Theme.Dialog na jiném místě. Snažím se znovu použít stejné TestActivity pro oba úkoly.

Vše, co hledám nastavení dynamicky. Kód je jednoduchý: Zde je onCreate mé aktivity, která pracuje s černým pozadím

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

a zde je Manifest Entry

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

A mezitím jsem našel příspěvek, který říká, že to zde nelze udělat, je příspěvek http://code.google.com/p/Android/issues/detail?id=4394 . silný pocit, že to lze udělat.

Všechny návrhy jsou vítány.

37
100rabh

Chcete tento problém vyřešit.

Problém: Jak používat stejnou aktivitu jako dialogové okno i celoobrazovkový režim.

Řešení : 

  1. Definujte svou aktivitu ve vašem AndroidManifest.xml s motivem @Android:style/Theme.Dialog
  2. V příslušném souboru .Java zkontrolujte, zda intent extra, který definuje režim dialog
  3. Pokud neexistuje, nastavte Theme na Android.R.style.Theme. Toto je výchozí theme, které se použije, pokud nedefinujete žádný motiv.

Kód :

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

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

Alternativní řešení:

Komplexnějším řešením je použití AlertDialog, jak je uvedeno níže:

  1. Definujte třídu ListAdapter rozšířenou z ArrayAdapter
  2. return 1 v getCount funkci

    @Override
    public int getCount() { return 1; }
    
  3. V getView funkci, inflatelayoutactivity potřebujete a udělejte jakékoli úpravy před vrácením 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;
    }
    

To je určitě druhá možnost volby, pokud nechcete dělat příliš mnoho zpracování v activityclass to by mohlo být možnost.

Jediným důvodem k uvážení tohoto řešení by mohlo být to, že logika, aby se ukázala v dialog, je izolována na místa, kde se používá jako dialog.

Obě možnosti fungovaly pro mě, ale ze zřejmých důvodů užívám první možnost. :-)

53
Deepak G M

můžete použít setTheme(..) před voláním setContentView(...)and super.oncreate() a mělo by fungovat dobře

45
Ahmed Salem

Stejně jako několik dalších, volání na setTheme onCreate (před nebo po mém volání na super.onCreate) nefungovala. Nicméně, přepsáním setTheme, jsem byl schopen určit jiné téma, než je uvedeno v Manifest.xml. Konkrétně následující problém fungoval bez problému:

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

Výše uvedené informace jsem nalezl v diskusi na adrese: https://code.google.com/p/Android/issues/detail?id=4394

11
user3570982

Volání Activity.setTheme() v onCreate() před voláním setContentView().

10
Reuben Scratton

použít setTheme před voláním super.onCreate(savedInstance)

3

Výchozí volání knihovny motivů:

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

V mém případě jsem používal AppCompat Theme, takže se ujistěte, že na svém id odkazujete na správnou knihovnu (tj.):

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

0
Victor R. Oliveira

Ve vaší situaci to nemusí být možné, ale můžete použít motiv:

Theme.Holo.DialogWhenLarge

a bude zobrazovat vaši aktivitu jako dialog, když je obrazovka velká, a jako běžná činnost, když je obrazovka malá. Toto je popsáno v dokumentaci k Androidu na Dialogy a také obsahuje informace o programování Dialog, který může být také Slunce jako celoobrazovkový fragment.

0
Xebozone