Frage zu Menüs

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

05.07.2009, 12:12:19 via Website

Schönen Sonntag miteinander,

hat irgendwer von Euch es schon einmal hinbekommen, während der Lifetime einer Activity ein Icon im Menü zu ändern ?

Ich denk mir das so, das wenn ich einen bestimmten Menüeintrag anklicke soll sich das Icon und der dahinterliegende Menütext ändern. Bisherige Versuche mit "onPrepareOptionsMenu" sind da leider gescheitert.

Möglicherweise mache ich da irgendetwas falsch.

Für Hinweise oder Tipps wäre ich sehr dankbar.

lg
Voss

lg Voss

Antworten
Fabien Röhlinger
  • Admin
  • Staff
  • Forum-Beiträge: 3.855

05.07.2009, 13:41:27 via Website

Hi Jörg,

ich verstehe leider nicht genau was Du meinst.

Meinst Du irgendein Menü?

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

05.07.2009, 14:10:04 via Website

Hallo Fabien,

nein .. ich meine ein bestimmtes Menü, also eines das in einer Applikation als Applkiaktionseigenens Menü selbst erstellt wird mit der Option : onCreateOptionsMenu(Menu menu)
1onCreateOptionsMenu(Menu menu)

Ein kleines Beispiel aus gegebenem Anlass in der App NoStalk. In der Applikation ist folgendes Menü eingebaut:
1@Override
2 public boolean onCreateOptionsMenu(Menu menu) {
3 MenuItem quit = menu.add(0, MENU_QUIT, 0, getString(R.string.systemMenuQuit));
4 {
5 quit.setIcon(R.drawable.ic_menu_close_clear_cancel);
6 }
7
8 /* Here comes the conditional menu entry for enabling/disabling notification icon */
9
10 if (checkPreferencesKeyNotifyExists("MYPREFS","notifyIcon") &&
11 loadPreferenceNotify("MYPREFS","notifyIcon")) {
12
13 MenuItem config =
14 menu.add(0, MENU_CONFIG, 0, getString(R.string.systemMenuiconConfigOff));
15 {
16 config.setIcon(R.drawable.ic_menu_info_details);
17 }
18 }
19 else {
20
21
22 MenuItem config =
23 menu.add(0, MENU_CONFIG, 0, getString(R.string.systemMenuiconConfigOn));
24 {
25 config.setIcon(R.drawable.ic_menu_info_details);
26 }
27 }
28
29 return true;
30 } //Ende onCreateOptionsMenu

Innerhalb dieser Menüaufbauroutine wird ein sogenanntes Conditional Menü erzeugt, also ein von bestimmten Bedingungen abhängiges Menü. In diesem Fall wird die Bedingung von einer zuvor gespeicherten oder auch nicht gespeicherten "sharedPreference" vorgegeben.

Zu jedem Menü gehört natürlich auch ein Eventmanager der bei Aufruf des Menüs die entsprechend gewählten Menüklicks abfängt und ggf. eine Aktion auslöst. Das sieht in meinem Fall zur Zeit so aus und ist im Moment allerdings nur ein Workarround (warum das erklär ich gleich noch)

1@Override
2 public boolean onOptionsItemSelected(MenuItem item) {
3
4
5 switch (item.getItemId()) {
6 case MENU_QUIT:
7 stopService(new Intent(this, CallListener.class));
8 finish();
9
10 return true;
11
12 case MENU_CONFIG:
13/* here comes the conditional Menu responder */
14 if (!loadPreferenceNotify("MYPREFS","notifyIcon")) {
15 Toast.makeText(this,
16"You have choosen to SHOW notification-icon, at next application start you have the option to disable it",
17Toast.LENGTH_LONG).show();
18 savePreferenceNotify("MYPREFS", "notifyIcon", true);
19 item.setEnabled(false);
20
21 }
22 else {
23 Toast.makeText(this,
24"You have choosen NOT to show notification-icon, at next application start you have the option to enable it",
25 Toast.LENGTH_LONG).show();
26 savePreferenceNotify("MYPREFS", "notifyIcon", false);
27 item.setEnabled(false);
28
29 }
30 return true;
31
32
33 }
34 return false;
35 }

Auch hier wird ein sogn. Conditional response gesetzt wieder durch Abfrage einer entsprechenden "sharedPreference". Allerdings setze ich hier als "Workaround" nur ein uns denselben Menüeintrag auf "disabled" um ihn nach einmaligem Ansprechen in der Activity nicht mehr auswählen zu können und weise darauf hin, dass erst mit dem nächsten Applikationsstart hier ein anderer Content erscheinen wird im Menü.

Lieber wäre es mir wenn ich zur Laufzeit der Activity bereits das MenüIcon bzw. dessen Text und die dahinterliegende Action ändern könnte. *grrml*
So wie es zur Zeit ist, wird erst bei nächsten appstart ein anderer Menüinhalt ausgegeben.

Es geht hier, nebenbei gesagt um das erste Update von NoStalk, wo es möglich sein wird das Notification Icon auszublenden.


Ich hoffe ich hab das verständlich ausgedrückt. Wenn nicht, einfach fragen ;)

lg
Vossi

lg Voss

Antworten
Mirko Herbig
  • Forum-Beiträge: 48

05.07.2009, 14:50:36 via Website

Bin mir jetzt nicht ganz sicher, ob ich dich richtig verstanden habe, denn die Lösung scheint mir zu einfach:

1public boolean onOptionsItemSelected(MenuItem item){
2 ...
3 switch(item.getItemId){
4 case MENU_CONFIG:
5 item.setIcon(R.drawable.menu_icon);
6 item.setTitle(R.string.menu_text);
7 ...
8 break;
9 ...
10 }
11 ...
12}

Zusätzlich musst du noch den Wert der dazugehörigen Präferenz prüfen, da die Menü ID natürlich nicht änderbar ist und du ja wissen musst, welche Funktion der Menüeintrag jetzt haben soll.

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

05.07.2009, 15:07:11 via Website

Lieber Mirko,

DAS war genau die Lösung die ich suchte !!!!!

manchmal ist man ja wie verbohrt wenn man über dem Code brütet .. warum in die Ferne schweifen wenn das Gute doch so nah ... die Methoden "setTitle()" und "setIcon()" sind irgendwie an mir vorübergezogen ....

DANKE Mirko, das hat mir sehr geholfen, auch im Sinne der Usability dieser nützlichen Applikation !!

Das nenn ich mal ne fixe, effektive Antwort, ganz im Sinne und Stil von AndroidPit.de !!!

P.S. Vielleicht hilft ja dieser Codeschnipsel auch anderen, die Usability Ihrer Apps zu verbessern.


lg
Voss

— geändert am 05.07.2009, 15:08:09

lg Voss

Antworten
Mirko Herbig
  • Forum-Beiträge: 48

05.07.2009, 15:29:36 via Website

Freut mich, wenn ich helfen konnte.

Happy Coding
Mirko

Antworten