Popup-Menü auf Canvas Oberfläche

  • Antworten:9
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 31

06.12.2018, 17:46:00 via Website

Hallo!
Wie kann ich ein Popup-Menü auf meiner Canvas-Oberfläche erscheinen lassen. Ich möchte, wenn ich auf eine bestimmte stelle in meiner Canvas-Oberfläche drücke, dass es mir an dieser stelle ein Popup-Menü zeigt.
Das drücken kann ich damit auswerten:

public boolean onTouchEvent(MotionEvent event) {

        int xClick = (int)event.getX();
        int yClick = (int)event.getY();

        xClick = (xClick - xM) / m;
        yClick = yClick / m;

        if (80 <= xClick && xClick <= 90    &&    70 <= yClick && yClick <= 80){
            //MenuAnzeigen
        }

        return true;
    }

Danke im Voraus!:D

Diskutiere mit!
Ludy
  • Mod
  • Blogger
  • Forum-Beiträge: 7.196

06.12.2018, 21:52:47 via Website

Hallo,

deine Zeile if (80 <= xClick && xClick <= 90 && 70 <= yClick && yClick <= 80){ hat redundant Anteile!

So sollte es reichen ;-) if ( (xClick <= 90) && (yClick <= 80) ) {

Beim #onTouchEvent wird mit den einzelnen Events gearbeitet um eine mehrfach Ausführung unterbunden wird.

@Override
public boolean onTouchEvent(MotionEvent event) {

    switch(event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            int xClick = Math.round(event.getX());
            int yClick = Math.round(event.getY());

            xClick = (xClick - xM) / m;
            yClick = yClick / m;

            if ( (xClick <= 90) && (yClick <= 80) ) {
                PopupMenu popupMenu = new PopupMenu(mContext, viewVonIrgendwas) {
                    @Override
                    public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.irgendwas:
                                // ToDo was passiert
                                return true;
                            default:
                                return super.onMenuItemSelected(menu, item);
                        }
                    }
                };
                popupMenu.inflate(R.menu.overflow_menu);
                popupMenu.show();
            }
        return true;
        }
    }
}

Alle Angaben sind ohne Gewähr.

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

Lebensmittelwarnung App-Thread

Download Samsung Firmware Tool

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 31

11.12.2018, 18:19:22 via Website

Hallo.
Danke für deine Antwort! Bisher habe ich damit aber keinen Erfolg. Bei

@Override
public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item)

kommt

Method does not override method from its superclass

Was muss ich verändern, damit dass funktioniert?

Die Zeile if (80 <= xClick && xClick <= 90 && 70 <= yClick && yClick <= 80)
kann nicht vereinfacht werden!
Wenn man es so schreibt, könnte es vereinfacht werden if (80 >= xClick && xClick <= 90 && 70 >= yClick && yClick <= 80)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.931

12.12.2018, 08:44:02 via Website

Hallo ,

zu A) - Du musst deine Hauptklasse entsprechend vererben.
zu B) - Dein If Statement macht trotzdem keinen Sinn, da hat Ludy durchaus recht.

Anmerkung zu A : Wenn du noch Anfänger in Sachen OOP Entwicklung bist, kann ich nur wärmstens das Erlernen der Grundlagen empfehlen.

— geändert am 12.12.2018, 09:05:53

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 511

12.12.2018, 10:18:10 via Website

Hallo erstens müsste die Methode so heißen.

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    return super.onMenuItemSelected(featureId, item);
}

Dies geht aber nur in einer von Activity geerbten Klasse
https://developer.android.com/reference/android/app/Activity.html#onMenuItemSelected(int,%20android.view.MenuItem)

In einer von AppCompacktActivity geerbten Klasse geht es nicht da dort die Methode final ist.
https://developer.android.com/reference/android/support/v7/app/AppCompatActivity.html#onKeyDown(int,%20android.view.KeyEvent)

Benutze da die Methode

   boolean onMenuOpened (int featureId,        Menu menu)

@saw00

zu A) - Du musst deine Hauptklasse entsprechend vererben.

In welcher Klasse ist den die Methode ?
onMenuItemSelected(MenuBuilder menu, MenuItem item)

— geändert am 12.12.2018, 11:13:51

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.931

12.12.2018, 10:29:02 via Website

@Jokel

da ich bei ihm nicht einsehen konnte, worin er das ganze versucht umzusetzen (z.b Activity), hatte ich diese Antwort eher global gesehen.
(Es hätte ja irgend eine selbst angelegte pseudo klasse sein)

Und auf seine Parameter hatte ich dann gar nicht mehr geachtet.
Das hast du ja treffend getan :-)

— geändert am 12.12.2018, 10:33:45

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 511

12.12.2018, 10:48:52 via Website

Bei dem If bin ich leider auch der Meinung das es richtig ist

if ((80 <= xClick && xClick <= 90)&& (70 <= yClick && yClick <= 80))

Er will einen Klick wenn X zwischen 80 und 90 liegt und Y zwischen 70 und 80 haben
sonnst nicht.

Wenn xClick zum zB. 85 ist, ist 80 <= xClick true, und xClick <= 90 auch true, Ergebnis true.
ist xClick= 70, ist ist 80 <= xClick false, und xClick <= 90 true , Ergebnis false.
ist xClick= 99, ist ist 80 <= xClick true , und xClick <= 90 false, Ergebnis false.

PS.

Und auf seine Parameter hatte ich dann gar nicht mehr geachtet.

waren auch die Parameter von Ludy.

— geändert am 12.12.2018, 11:11:09

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.931

12.12.2018, 11:32:43 via Website

Und schon wieder so ein Fall von Übersichtlichkeit :-)

if ( ((x >= 80) && (x <= 90)) && ((y >= 70) && (y <= 80)) )
{
// true
}

@Jokel - Rein aus Interesse :
Schreibst du das auch so , wie der TE , weil du direkt drauf kamst ?
Ludy hat zumindest auf Anhieb gleich "falsch" gelesen , wie ich.

— geändert am 12.12.2018, 11:41:13

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 511

12.12.2018, 15:36:14 via Website

Schreibst du das auch so , wie der TE , weil du direkt drauf kamst ?

Was meist du damit? Ich habe den Code nicht abgetippt und in AS eingefügt wenn du das meinst.
Mit den Klammern ist es natürlich übersichtlicher auch eindeutiger sollte aber auch ohne den Klammern gehen. Da es alles „Und“ Verknüpfungen sind.

(x >= 80) && (x <= 90) ist das gleiche wie (80 <= x) && (x<=90)

(x >= 80) = (80 <= x)

https://de.wikipedia.org/wiki/Vergleich_%28Zahlen%29

PS. Ok die Schreibweise ist aus Programmierer sicht etwas unüblich.
Mathematisch ist es das gleiche.
a < X < b

— geändert am 12.12.2018, 16:39:52

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 511

12.12.2018, 17:43:57 via Website

das Popup würde ich so machen

PopupMenu popupMenu = new PopupMenu(mContext, viewVonIrgendwas); 
popupMenu.setOnMenuItemClickListener( new PopupMenu.OnMenuItemClickListener(){
        @Override
        public boolean onMenuItemClick(MenuItem item) {
                    switch (item.getItemId()) {
                        case R.id.irgendwas:
                            // ToDo was passiert
                            return true;
                        default:
                            return super.onMenuItemClick(item);

                    }   
        }       
});
popupMenu.inflate(R.menu.overflow_menu);
popupMenu.show();

overflow_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/irgendwas"
        android:icon="@drawable/ic_irgendwas"
        android:title="irgendwas" />
</menu>

— geändert am 12.12.2018, 17:45:54

Hilfreich?
Diskutiere mit!

Empfohlene Artikel