AlertDialog (HTC-)Theme verschwindet?

  • Antworten:4
Gelöschter Account
  • Forum-Beiträge: 602

13.02.2011, 23:41:02 via Website

Ich nutze in meiner Anwendung einen AlertDialog. Innerhalb der Haupt-Activity wird der AlertDialog mit dem HTC-Theme (Buttons, Rahmen, etc) angezeigt. Jetzt habe ich die AlertDialog-Geschichte in eine neue Activity ausgelagert, um sie besser ansprechen zu können (die Haupt-Acticity fungiert als Ablauf, die zweite Activity als Dialog-"Anbieter"). Dabei geht jedoch das Theme und der Inhalt verloren - obwohl der gleiche Code benutzt wird. Hat jemand eine Idee, wie das sein kann bzw. an was das liegt?

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

14.02.2011, 00:40:28 via Website

Zeig mal den code und wie du es aufrufst ... evtl. liegst am Context ?

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Gelöschter Account
  • Forum-Beiträge: 602

14.02.2011, 08:47:51 via Website

Aufgerufen wird über
1Intent i = new Intent(this, PopupDialog.class);
2 i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
3 startActivity(i);

Und das hier ist der Code des Dialogs
1package net.krisdoff.SMSReceiver;
2
3import android.app.Activity;
4import android.app.AlertDialog;
5import android.app.Dialog;
6import android.content.DialogInterface;
7import android.content.Intent;
8import android.os.Bundle;
9
10public class PopupDialog extends Activity{
11 private static ToolsProvider tp = null;
12
13 @Override
14 public void onCreate(Bundle savedInstanceState) {
15 super.onCreate(savedInstanceState);
16 showDialog(1);
17 }
18
19 protected Dialog onCreateDialog(int id){
20 switch(id){
21 case 1:
22 ToolsProvider.dLog("Started buildAlertDialog()");
23 AlertDialog.Builder builder = new AlertDialog.Builder(this);
24 builder.setIcon(R.drawable.ic_launcher_popup)
25 // .setCancelable(false)
26 .setPositiveButton(getString(R.string.actionOpen), new DialogInterface.OnClickListener() {
27 public void onClick(DialogInterface dialog, int id) {
28 ReminderService.cancelTimer();
29 Intent sI = new Intent(getApplicationContext(), ReminderService.class);
30 stopService(sI);
31 StatusProvider.removeAllBits();
32 tp.cancelNotif(tp.getNotifID());
33 if(tp.wl.isHeld())
34 tp.wl.release();
35 startActivity(tp.createSMSintent());
36 finish();
37 }
38 })
39 .setNegativeButton(getString(R.string.actionClose), new DialogInterface.OnClickListener() {
40 public void onClick(DialogInterface dialog, int id) {
41 if(tp.getBoolean("popUpClearNotification")){
42 ReminderService.cancelTimer();
43 Intent sI = new Intent(getApplicationContext(), ReminderService.class);
44 stopService(sI);
45 StatusProvider.removeAllBits();
46 tp.cancelNotif(tp.getNotifID());
47 }else
48 StatusProvider.removeBit(StatusProvider.POPUP_ACTIVE);
49 if(tp.wl.isHeld())
50 tp.wl.release();
51 finish();
52 }
53 })
54 .setOnCancelListener(new DialogInterface.OnCancelListener(){
55 public void onCancel(DialogInterface dialog){
56 StatusProvider.removeBit(StatusProvider.POPUP_ACTIVE);
57 if(tp.wl.isHeld())
58 tp.wl.release();
59 finish();
60 }
61 });
62 if(tp.getBoolean("popUpQuickReply")){
63 builder.setNeutralButton(getString(R.string.actionReply), new DialogInterface.OnClickListener() {
64 public void onClick(DialogInterface dialog, int id) {
65 ReminderService.cancelTimer();
66 Intent sI = new Intent(getApplicationContext(), ReminderService.class);
67 stopService(sI);
68 StatusProvider.removeAllBits();
69 tp.cancelNotif(tp.getNotifID());
70 Intent i = new Intent(getApplicationContext(), QuickReplyDialog.class)
71 .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
72 startActivity(i);
73 finish();
74 }
75 });
76 }
77 if(!tp.getBoolean("generalPrivacy")){
78 builder.setTitle(tp.rName)
79 .setMessage(tp.rMessage);
80 }
81 else{
82 builder.setTitle(getString(R.string.PrivacyTitle))
83 .setMessage(getString(R.string.PrivacyMessage));
84 }
85 AlertDialog alert = builder.create();
86 ToolsProvider.dLog("Finished buildAlertDialog()");
87 return alert;
88 case 2:
89 AlertDialog.Builder b = new AlertDialog.Builder(this);
90 b.setTitle("Hallo")
91 .setMessage("Nachricht");
92 return b.create();
93 default:
94 return null;
95 }
96 }
97
98 public static boolean setToolsProvider(ToolsProvider toPr){
99 tp = toPr;
100 return true;
101 }
102
103 @Override
104 public void onDestroy(){
105 super.onDestroy();
106
107 StatusProvider.removeBit(StatusProvider.POPUP_ACTIVE);
108
109 if(tp.wl.isHeld())
110 tp.wl.release();
111 }
112}

Der case 2 ist hierbei nur testweise, liefert allerdings auch das Standard Android Dialog-Layout.
Ich hatte den Dialog auch mal einfach als normale Methode (nicht in onCreateDialog), machte aber keinen Unterschied. Erstaunlich für mich ist dabei auch, dass ein anderer Dialog (siehe Code unten) "normal", sprich mit richtigem Theme aufgerufen wird, wenn ich im Intent nur PopupDialog durch AboutDialog ersetze.

1package net.krisdoff.SMSReceiver;
2
3import android.app.Activity;
4import android.app.AlertDialog;
5import android.content.DialogInterface;
6import android.os.Bundle;
7
8public class AboutDialog extends Activity{
9 @Override
10 public void onCreate(Bundle savedInstanceState){
11 super.onCreate(savedInstanceState);
12 String title = getString(R.string.app_name)+" "+getString(R.string.app_version);
13 String message = getString(R.string.app_about);
14 buildDialog(title, message).show();
15 }
16
17 private AlertDialog buildDialog(String title, String message){
18 AlertDialog.Builder builder = new AlertDialog.Builder(this);
19 builder.setIcon(R.drawable.ic_launcher_config)
20 .setCancelable(false)
21 .setTitle(title)
22 .setMessage(message);
23 builder.setNeutralButton(getString(R.string.actionClose), new DialogInterface.OnClickListener() {
24 public void onClick(DialogInterface dialog, int id) {
25 finish();
26 }
27 });
28 AlertDialog alert = builder.create();
29 return alert;
30 }
31}

Hier ist zwar noch nicht die onCreateDialog realisiert, aber wie gesagt machte das beim PopupDialog keinen Unterschied.

:/

Antworten
Gelöschter Account
  • Forum-Beiträge: 602

14.02.2011, 08:54:09 via Website

Kann es sein, dass durch den Rückgabe-Typ Dialog der onCreateDialog die Informationen des AlertDialog verloren gehen? Also beim Cast (während der Rückgabe?) zum Dialog?

Ich dachte ich hätte das in einem Beispeil so gesehen, aber ich werd das mal ausprobieren (also wieder weg von onCreateDialog) ...

Edith:
Nein, doch nicht der Grund. Weiterhin der Standard-Android-Style. Nachfolgend der Code, mit dem ich's probiert habe.

1package net.krisdoff.SMSReceiver;
2
3import android.app.Activity;
4import android.app.AlertDialog;
5import android.app.Dialog;
6import android.content.DialogInterface;
7import android.content.Intent;
8import android.os.Bundle;
9
10public class PopupDialog extends Activity{
11 private static ToolsProvider tp = null;
12
13 @Override
14 public void onCreate(Bundle savedInstanceState) {
15 super.onCreate(savedInstanceState);
16 createDialog().show();
17// showDialog(1);
18 }
19
20 private AlertDialog createDialog(){
21 ToolsProvider.dLog("Started buildAlertDialog()");
22 AlertDialog.Builder builder = new AlertDialog.Builder(this);
23 builder.setIcon(R.drawable.ic_launcher_popup)
24// .setCancelable(false)
25 .setPositiveButton(getString(R.string.actionOpen), new DialogInterface.OnClickListener() {
26 public void onClick(DialogInterface dialog, int id) {
27 ReminderService.cancelTimer();
28 Intent sI = new Intent(getApplicationContext(), ReminderService.class);
29 stopService(sI);
30 StatusProvider.removeAllBits();
31 tp.cancelNotif(tp.getNotifID());
32 if(tp.wl.isHeld())
33 tp.wl.release();
34 startActivity(tp.createSMSintent());
35 finish();
36 }
37 })
38 .setNegativeButton(getString(R.string.actionClose), new DialogInterface.OnClickListener() {
39 public void onClick(DialogInterface dialog, int id) {
40 if(tp.getBoolean("popUpClearNotification")){
41 ReminderService.cancelTimer();
42 Intent sI = new Intent(getApplicationContext(), ReminderService.class);
43 stopService(sI);
44 StatusProvider.removeAllBits();
45 tp.cancelNotif(tp.getNotifID());
46 }else
47 StatusProvider.removeBit(StatusProvider.POPUP_ACTIVE);
48 if(tp.wl.isHeld())
49 tp.wl.release();
50 finish();
51 }
52 })
53 .setOnCancelListener(new DialogInterface.OnCancelListener(){
54 public void onCancel(DialogInterface dialog){
55 StatusProvider.removeBit(StatusProvider.POPUP_ACTIVE);
56 if(tp.wl.isHeld())
57 tp.wl.release();
58 finish();
59 }
60 });
61 if(tp.getBoolean("popUpQuickReply")){
62 builder.setNeutralButton(getString(R.string.actionReply), new DialogInterface.OnClickListener() {
63 public void onClick(DialogInterface dialog, int id) {
64 ReminderService.cancelTimer();
65 Intent sI = new Intent(getApplicationContext(), ReminderService.class);
66 stopService(sI);
67 StatusProvider.removeAllBits();
68 tp.cancelNotif(tp.getNotifID());
69 Intent i = new Intent(getApplicationContext(), QuickReplyDialog.class)
70 .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
71 startActivity(i);
72 finish();
73 }
74 });
75 }
76 if(!tp.getBoolean("generalPrivacy")){
77 builder.setTitle(tp.rName)
78 .setMessage(tp.rMessage);
79 }
80 else{
81 builder.setTitle(getString(R.string.PrivacyTitle))
82 .setMessage(getString(R.string.PrivacyMessage));
83 }
84 AlertDialog alert = builder.create();
85 ToolsProvider.dLog("Finished buildAlertDialog()");
86 return alert;
87 }
88
89// rest des codes ausgeschnitten
90
91}

— geändert am 14.02.2011, 08:59:01

Antworten
Gelöschter Account
  • Forum-Beiträge: 602

17.02.2011, 23:20:02 via Website

Ich denke ich kann mein Problem eingrenzen. Es scheint am Builder zu liegen.
Füttere ich dessen setTitle und setMessage mit einem (über den Intent übergebenen) String, klappt es nicht.
Füttere ich ihn beispielsweise direkt mit "asd", klappt es.
Füttere ich ihn mit einer Resource (also getString(R.string.test)), funktioniert es ebenfalls.

Da bleibt mir noch herauszufinden, was da schief läuft :/

Edit:
Ich habe es - ich habe einfach leere Strings übergeben. Weshalb auch immer die Strings null waren :/ Aber immerhin habe ich die Ursache gefunden :)
Falls also jemand irgendwann mal ein ähnliches Problem hat: ein AlertDialog wird als normaler, leerer Dialog dargestellt, wenn Parameter von setTitle/setMessage null sind.

— geändert am 17.02.2011, 23:24:56

Antworten