it-swarm.com.de

Android: Programmgesteuertes Festlegen eines Designs für eine Aktivität auf Theme.Dialog

Ich habe also eine Activity (sprich TestActivity), die als normale ungeänderte Activity sowie an anderer Stelle als Theme.Dialog fungieren muss. Ich versuche, dieselbe TestActivity für beide Aufgaben wiederzuverwenden.

Alles, was ich suche, um das Thema dynamisch einzustellen .. Der Code ist einfach: .__ Hier ist die onCreate meiner Aktivität, die mit einem schwarzen Hintergrund arbeitet

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

und hier ist der Manifest-Eintrag

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

Und in der Zwischenzeit habe ich einen Beitrag gefunden, der besagt, dass dies nicht möglich ist. Hier steht der Beitrag http://code.google.com/p/Android/issues/detail?id=4394 starkes Gefühl, dass es möglich ist.

Alle Vorschläge sind willkommen.

37
100rabh

Möchte für dieses Problem ein Problem umgehen.

Problem: So verwenden Sie dieselbe Aktivität sowohl für Dialog- als auch für den gesamten Bildschirm.

Lösung: 

  1. Definieren Sie Ihre Aktivität in Ihrer AndroidManifest.xml mit dem Design @Android:style/Theme.Dialog
  2. Suchen Sie in Ihrer .Java-Datei nach einem intent-Zusatz, der den dialog-Modus definiert. 
  3. Wenn es nicht existiert, setzen Sie Theme auf Android.R.style.Theme. Dies ist der Standardwert theme, der angewendet wird, wenn Sie kein Thema definieren.

Code:

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

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

Alternative Lösung:

Eine komplexere Lösung ist, AlertDialog wie folgt zu verwenden:

  1. Definieren Sie eine ListAdapter-Klasse, die um ArrayAdapter erweitert wurde. 
  2. 1 in der Funktion getCount zurückgeben

    @Override
    public int getCount() { return 1; }
    
  3. In der getView-Funktion inflate des layout des activity müssen Sie vor dem Zurückgeben des view Anpassungen vornehmen.

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

Dies ist definitiv eine Option der zweiten Wahl, wenn Sie in activityclass nicht zu viel Verarbeitungsaufwand ausführen. Dies könnte eine Option sein.

Ein einziger Grund, um diese Lösung in Betracht zu ziehen, könnte darin bestehen, dass die Logik, mit der sie in einem dialog angezeigt wird, an den Stellen isoliert ist, an denen sie als Dialog verwendet wird.

Beide Optionen haben sich für mich bewährt, aber aus offensichtlichen Gründen nehme ich die erste Option. :-)

53
Deepak G M

sie können setTheme(..) verwenden, bevor Sie setContentView(...)und super.oncreate() aufrufen, und es sollte einwandfrei funktionieren

45
Ahmed Salem

Wie viele andere auch, funktionierten Aufrufe von setTheme in onCreate (vor oder nach meinem Aufruf von super.onCreate) nicht. Durch das Überschreiben von setTheme konnte ich jedoch ein anderes Thema als das in Manifest.xml angegebene festlegen. Im Einzelnen funktionierte folgendes ohne Probleme:

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

Ich fand das oben in der Diskussion unter: https://code.google.com/p/Android/issues/detail?id=4394

11
user3570982

Rufen Sie Activity.setTheme() in onCreate() auf, bevor Sie setContentView() aufrufen.

10
Reuben Scratton

verwenden Sie setTheme, bevor Sie super.onCreate(savedInstance) aufrufen.

3

Standardaufruf der Themenbibliothek:

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

In meinem Fall habe ich AppCompat Theme verwendet. Stellen Sie daher sicher, dass Sie auf Ihrer ID die richtige Bibliothek verweisen (d. H.):

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

Dies trifft möglicherweise nicht auf Ihre Situation zu, aber Sie können das Thema verwenden:

Theme.Holo.DialogWhenLarge

ihre Aktivität wird als Dialog angezeigt, wenn der Bildschirm groß ist, und als regelmäßige Aktivität, wenn der Bildschirm klein ist. Dies wird in der Android-Dokumentation unter Dialoge beschrieben und enthält auch Informationen zum Programmieren eines Dialogs das kann auch Sun als Vollbildfragment.

0
Xebozone