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.
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:
@Android:style/Theme.Dialog
.Java
-Datei nach einem intent
-Zusatz, der den dialog
-Modus definiert. 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:
ListAdapter
-Klasse, die um ArrayAdapter
erweitert wurde. 1
in der Funktion getCount
zurückgeben
@Override
public int getCount() { return 1; }
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 activity
class
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. :-)
sie können setTheme(..)
verwenden, bevor Sie setContentView(...)
und super.oncreate()
aufrufen, und es sollte einwandfrei funktionieren
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
Rufen Sie Activity.setTheme()
in onCreate()
auf, bevor Sie setContentView()
aufrufen.
verwenden Sie setTheme
, bevor Sie super.onCreate(savedInstance)
aufrufen.
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);
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.