Grundlagen: Optionsmenü

W

wulliwu

Neues Mitglied
0
Hallo Community,

ich habe ein richtiges Anfängerproblem:

Ist es wohl nicht! Denn was ich auch treibe, die override-funktion

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
return super.onCreateOptionsMenu(menu);
}

wird nicht aufgerufen? Ist das OptionsMenu nicht automatisch Bestandteil einer Activity? Muß man ein OptionsMenu in einer xml-Datei deklarieren?

Danke für Eure Antworten!

Viele Grüße
 
Zuletzt bearbeitet:
Willkommen im Forum!

Woher weißt du das die Funktion nicht aufgerufen wird?
Hast du mal das versucht:

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
Log.i("wulliwus App","onCreateOptionsMenu aufgerufen")
return super.onCreateOptionsMenu(menu);
}

Im Logcat sollte das dann auftauchen.
Ansonsten kann ich dir dieses kostenlose Buch empfehlen:
dpunkt.verlag | E-Books
Da sind die Options-Menü-Sachen gut erklärt.

Beispielcode:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
boolean result = super.onCreateOptionsMenu(menu);
menu.add(0, ABSCHICKEN_ID, "Melden");
return result;
}

Damit hast du schon mal einen sichtbaren Menüeintrag hinzugefügt. Wenn du draufklickst passiert aber noch nichts. Wenn du wissen willst wie das dann geht-->Buch runterladen, Seite 27 des pdfs bzw Seite 11 des Buches und folgende. Außerdem Kapitel 5.4
 
Zuletzt bearbeitet:
Zusätzlich:
Wenn du onKeyDown überschreibst und true zurückgibst, ist es logisch dass sie nicht aufgerufen wird, wenn du die Menü Taste drückst.
True sagt dem System nämlich, du hast das Event gehandlet und kein anderer muss das Event noch handlen.
Also entweder false zurückgeben oder nicht überschreiben. ;)
 
  • Danke
Reaktionen: jannux
Wie kommst du jetzt auf onKeyDown? ^^

Außerdem:
Also entweder false zurückgeben oder nicht überschreiben.
Oder überschreiben, das machen was du willst, und dann true zurückgeben, wenn es anscheinend funktioniert hat. So wie im Beispielcode :p
 
FelixL schrieb:
Wie kommst du jetzt auf onKeyDown? ^^

Außerdem:

Oder überschreiben, das machen was du willst, und dann true zurückgeben, wenn es anscheinend funktioniert hat. So wie im Beispielcode :p

Wenn du onKeyDown überschreibst, und im Falle vom KeyEvent.KEYCODE_MENU
true zurückgibst, wird onCreateOptionsMenu ja wohl nicht aufgerufen. oO
 
Ja, aber danach fragt er ja nicht, oder? :p
Er überschreibt ja nur onCreateOptionsMenu.

An und für sich hast du aber natürlich recht.
 
Hat er gesagt dass er es nicht überschreibt? :p
Ich nehme mal an seine App besteht nicht nur aus dem oben geposteten Code :lol:

Wollte nur mögliche Fehlerquellen von vornerein ausschließen.:ohmy:
 
Vielen Dank für die Anregungen! Mittlerweile bin ich selbst drauf gekommen, woran es gelegen hat: Man muß natürlich auch die Menütaste drücken! (Anfänger ;))) )
 
Natürlich auch nicht schlecht :-D
 
wulliwu schrieb:
Vielen Dank für die Anregungen! Mittlerweile bin ich selbst drauf gekommen, woran es gelegen hat: Man muß natürlich auch die Menütaste drücken! (Anfänger ;))) )

WTF? :thumbsup:
 
Dieser Thread hat mir ein Grinsen am Montag Morgen beschert, sehr gut :)
 
Hallo zusammen, :smile:

ich habe auch ein Optionsmenu gebastelt. Das funktioniert auch wirklich wunderbar, wenn man auf den Menu-Button des Handys drückt.

Jetzt dachte ich (auch aufgrund dieses Threads) dass man dem User noch die Möglichkeit geben sollte, mit einem Button in der Activity selbst das Optionsmenu aufrufen zu können. So könnte gewährleistet werden, dass diese Option nicht übersehen wird.

Geht das denn überhaupt?

Ich habe das Optionsmenu so gebastelt:

Code:
@Override
    public boolean onCreateOptionsMenu(Menu menu){
    super.onCreateOptionsMenu(menu);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    return true;
    }
       
       @Override
       public boolean onOptionsItemSelected(MenuItem item) {
           switch (item.getItemId()){
           case R.id.tipps:
            Intent tipps = new Intent(this, Tipps.class);
            startActivity(tipps);
               break;
           case R.id.hinweis:
            Intent hinweis = new Intent(this, Hinweis.class);
            startActivity(hinweis);
               break;
           case R.id.sonstiges:
            Intent sonstiges = new Intent(this, Sonstiges.class);
            startActivity(sonstiges);
               break;
  
           } return true;
       }
Dann dachte ich, bastel ich einfach einen Button der dieses Menü aufrufen kann, zusätzlich zu dem Menu-Button des Handys.

Code:
       public void menuButton (final View view, Menu menu){
            switch (view.getId()){
            case R.id.bt_menu:
                onCreateOptionsMenu(menu);    
                break;
            }
            }
Das "onCreateOptionsMenu(menu);" wird ja hier "public boolean onCreateOptionsMenu(Menu menu){...}" deklariert oder? Dann müsste das doch so gehn?

Wenn ich aber den Button drück dann kommt das unschöne Fensterchen "Forced Close".

Ich hab leider nix zu diesem Thema im Netz gefunden.

Könnt Ihr mir helfen?

Vielen Dank im Voraus.

Liebe Grüße,
pyretta


EDIT:

Oder könnt Ihr mir sagen wie so ein Menü genannt wird wie in dem Dateianhang gezeigt wird? Dann kann ich mal danach im Netz suchen. Das wäre fast schon besser als mit einem Button.

Also, das Menü, das mit dem "Köpfchen" schon unten am Displayrand rausschaut. Wenn man dann das Menüköpfchen hochzieht dann erscheint das eigentliche Menü.

Ich hoffe Ihr versteht überhaupt was ich meine...
 

Anhänge

  • menuskizze.jpg
    menuskizze.jpg
    8,6 KB · Aufrufe: 308
Zuletzt bearbeitet:
public void menuButton (final View view, Menu menu){

In der Zeile müsste der Funktion ja ein Menu übergeben werden. Ich gehe mal davon aus das das in deinem OnClickListener drin steht, und da aber kein Menu übergeben wird. Das wäre der erste Fehler. Der zweite Fehler ist der Aufruf der falschen Funktion.


Beispielcode wie es funktionieren müsste:

Code:
    //@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final Button button1 = (Button) findViewById(R.id.button_id_1);
        final Button button2 = (Button) findViewById(R.id.button_id_2);

        button1.setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
        	openOptionsMenu();
        	}
        });
    
        button2.setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
        	closeOptionsMenu();
        }
    });
    }

Du kannst dann ganz normal in public boolean onCreateOptionsMenu (Menu menu) dein Menü befüllen, wie du es jetzt auch schon machst.


Edit: Editieren während ich schreibe ist fies :D
Dazu kann ich aber nichts sagen. Musst du wahrscheinlich selbst bauen. Andere Möglichkeit wäre ein so gestylter Button der automatisch hoch rutscht wenn das Menü hoch kommt. Weiß aber wie gesagt nicht wie das geht.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: pyretta
pyretta schrieb:
Also, das Menü, das mit dem "Köpfchen" schon unten am Displayrand rausschaut. Wenn man dann das Menüköpfchen hochzieht dann erscheint das eigentliche Menü.

Ich hoffe Ihr versteht überhaupt was ich meine...

Zumindest als seitliche "Reinrutschleisten" könnteste vorgefertigten Code nehmen. Gibts auf Google Code.. findeste irgendwo auf anddev.org.
Ansonsten heißtes selber schreiben...
Hier ist der link
http://code.google.com/p/mobile-anarchy-widgets/

Edit: Anscheinend gehts auch vertikal.. kannst ja mal dein Glück dort versuchen ;)
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: pyretta
laaaaaaaaaaangweilig :biggrin:
 
Ne, besser :D
geht ebenfalls horizontal, dein DockPanel lässt sich aber nur anklicken, nicht schön ziehen und schubsen. Das geht beim SlidingDrawer.
Aussehen/Bilder sollten bei beiden komplett frei sein, deins kann man aber auch von oben und von links kommen lassen. Aber wer will das schon :p
 
  • Danke
Reaktionen: pyretta
Boahr Jungs, vielen Dank! :scared:

Werde mich gleich mal mit dem SlidingDrawer vertraut machen. Wäre nie drauf gekommen dass es so heißen könnte.

Und danke für die Codeberichtigung. Schon wieder was dazugelernt. :smile:

Und noch sorry für das Editieren während du schriebst.
(klingt irgendwie wie ein Filmtitel... :blink: - Editieren während du schriebst. Die Fortsetzung von "Während du schliefst". Jetzt neu in Ihrem Kino um die Ecke. :blink: .)
 
Schade, zu früh gefreut...

Eclipse nimmt beide Versionen nicht an. :huh:
Also weder SlidingDrawer noch DockPanel.

Error Log:

Warning
Tue Feb 22 10:22:01 CET 2011
AndroidManifest: Ignoring unknown 'com.MobileAnarchy.Android.Widgets.DockPanel.DockPanel' XML element

Error
Tue Feb 22 11:13:31 CET 2011
ergebnis.xml: ClassCastException: com.android.layoutlib.bridge.MockView cannot be cast to android.view.ViewGroup

Auszug aus dem Hinweisblock von "Graphical Layout" in der XML-Ansicht:

error!
ClassCastException: com.android.layoutlib.bridge.MockView cannot be cast to android.view.ViewGroup
Exception details are logged in Window > Show View > Error LogThe following classes could not be found:
- SlidingDrawer

Ich verwende Android 2.1 in diesem betreffenden Projekt.
Habe das "Graphical Layout" auch schon auf 2.3.1 gestellt - ging trotzdem nicht.

Ich habs auch direkt von der Tutorial-Seite kopiert. Also verschrieben kann ich mich ja nicht haben. Also ich hab die XML und die Activity angepasst wie beschrieben.

Wirklich schade. Das wäre sowas von genau das was ich mir vorgestellt habe. :unsure:
 
Ich habs nun doch mit dem "Menü"-Button gelöst. Geht ja auch. :smile:

Ich frage mich jetzt aber, kann man einem Menüpunkt einen zweizeiligen Menütitel geben?

z.B:

Multimedia << Haupttitel
Filme, Spiele, Software, etc. << Untertitel

Oder geht das gar nicht?
 

Ähnliche Themen

G
  • Gelöschtes Mitglied 410096
Antworten
10
Aufrufe
1.343
Gelöschtes Mitglied 410096
G
T
Antworten
1
Aufrufe
1.197
TomTom83
T
T
Antworten
4
Aufrufe
1.137
TomTom83
T
Zurück
Oben Unten