- Forum-Beiträge: 215
12.02.2016, 10:06:11 via Website
12.02.2016 10:06:11 via Website
Eine Frage hätte ich da aber noch.
Öffnet sich das Popup auch automatisch bei einem längeren Drücken auf ein ListViewElement?
12.02.2016, 10:06:11 via Website
12.02.2016 10:06:11 via Website
Eine Frage hätte ich da aber noch.
Öffnet sich das Popup auch automatisch bei einem längeren Drücken auf ein ListViewElement?
12.02.2016, 10:09:41 via Website
12.02.2016 10:09:41 via Website
Ich denke nicht.
Du musst im "onLongClickListener" schon angeben, was passieren soll.
12.02.2016, 10:36:45 via Website
12.02.2016 10:36:45 via Website
Ich versuche das Popup-Beispiel von Pascal umzusetzen.
Hierbei tauchen die ersten Fehler auf:
PopupMenu popup = new PopupMenu(MainActivity.this,listView);
Unreachable Statement heißt es.
Das erste Argument ist der Kontext, das zweite der Anker (wohl das Element, das das Anzeigen des Popups bewirken soll).
Bis zur Eingabe von listView war noch nichts rot unterstrichen.
12.02.2016, 10:42:56 via Website
12.02.2016 10:42:56 via Website
final ListView listView = (ListView) findViewById(R.id.view_item);
habe ich übrigens in onCreate geschrieben.
view_item ist die einzelne Zeile innerhalb der ListView.
12.02.2016, 10:43:55 via Website
12.02.2016 10:43:55 via Website
Unreachable Statement ist immer ein Statemant, also ein Befehl, von dem der Compiler der Meinung ist, dass es (egal was auch passiert) nie ausgeführt werden kann, weil es nicht zu erreichen ist.
12.02.2016, 10:57:36 via Website
12.02.2016 10:57:36 via Website
Kommando zurück:
ich habe das Zeug nach dem return geschrieben. Das konnte ja nicht gut gehen.
— geändert am 12.02.2016, 10:57:53
12.02.2016, 10:59:38 via Website
12.02.2016 10:59:38 via Website
Exakt Daher kam der Fehler
Gleiches Problem bekommst du auch, wenn du eine if-Abfrage hast, und da die returns rein schreibst.
Dann sollte man immer,zur Sicherheit, ganz am Ende noch ein "return null" setzen, sonst kann es sein, dass der Compiler nie ein return erreicht.
12.02.2016, 11:10:08 via Website
12.02.2016 11:10:08 via Website
OK, es geht jetzt. Jedenfalls die Anzeige mit dem kleinen BeispielToast.
Eher nebensächliche Frage:
Das Popup wird so eher links oben positioniert. Kann man das nicht zentrieren oder woanders hin setzen?
12.02.2016, 11:12:25 via Website
12.02.2016 11:12:25 via Website
Du bindest das bisher an die ListView und nicht an das ListItem.
Dadurch wird das da oben angezeigt.
Binde es an an anderes View, dann ists besser, bsp. an die gecklickte View die du im clickEvent übergeben bekommst.
LG Pascal //It's not a bug, it's a feature.
12.02.2016, 11:13:46 via Website
12.02.2016 11:13:46 via Website
Das sollte gehen, wenn du in der XML des PopUps, unter
<menu xmlns:androclass="http://schemas.android.com/apk/res/android">
zu
<menu xmlns:androclass="http://schemas.android.com/apk/res/android>
android:layout_gravity="center_vertical|center_horizontal>
änderst.
EDIT: Pascals Lösung ist die "sauberere".
— geändert am 12.02.2016, 11:14:36
12.02.2016, 11:23:09 via Website
12.02.2016 11:23:09 via Website
Ich hatte noch einen Denkfehler.
Eigentlich brauche ich mein DialogFragment ja noch. Das Popup ist ja nur eine Zwischenstation.
Der erste Test läuft gerade.
12.02.2016, 11:31:02 via Website
12.02.2016 11:31:02 via Website
Das freut mich zu hören
12.02.2016, 11:40:00 via Website
12.02.2016 11:40:00 via Website
Also, den Toast zeigt er immer noch richtig an.
Ich teste auf den New-Zweig des Popups und versuche auf meine alten Methoden zuzugreifen, die bereits funktionierten.
Aber es tut sich nichts.
Hier mal zur Übersicht der Code des "Long-Teils":
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int pos, long id) {
Log.v("longClick", "arg0.getItemAtPosition(pos) " + arg0.getItemAtPosition(pos));
String father = ((TextView) arg1.findViewById(R.id.textViewId)).getText().toString();
mId = father;
Log.d("double click", father);
PopupMenu popup = new PopupMenu(MainActivity.this,listView);
popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
//registering popup with OnMenuItemClickListener
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(MainActivity.this, "You Clicked : " + item.getTitle(), Toast.LENGTH_SHORT).show();
if(item.getTitle()=="Copy Info"){copyInfoId(item.getItemId());}//mit equals: getTitle().equals(“Action 1″)
else if(item.getTitle()=="Insert Info"){insertInfo(item.getItemId());}
else if(item.getTitle()=="New"){EnterNewInfo(item.getItemId());}
return true;
}
});
popup.show();
return true;
}
});
12.02.2016, 11:41:07 via Website
12.02.2016 11:41:07 via Website
Mit den returns komme ich noch nicht so klar. Das könnten potentielle Fehlerquellen sein.
12.02.2016, 11:43:49 via Website
12.02.2016 11:43:49 via Website
Kommt wenigstens der erste "Toast"?
Und Über den Strig würde ich das nicht vergleichen, schon garncith mit ==.
String Vergleioche bitte immer mit String#equals(otherString)
Und beim menü bietet es sich an über die ItemID zu gehen.
Also swich/cahse über die ID und fertig.
Damit sparst du dir das If getue
LG Pascal //It's not a bug, it's a feature.
12.02.2016, 11:44:25 via Website
12.02.2016 11:44:25 via Website
Bedenken musst du einfach nur, dass returns immer, und sofort bei Erreichen, die Aktion abbrechen.
12.02.2016, 11:46:10 via Website
12.02.2016 11:46:10 via Website
Aber so wie das oben im Code mit returns ist, passt das
LG Pascal //It's not a bug, it's a feature.
12.02.2016, 11:47:27 via Website
12.02.2016 11:47:27 via Website
Hallo Pascal,
ja, der erste Test-Toast geht korrekt.
Bedenken musst du einfach nur, dass returns immer, und sofort bei
Erreichen, die Aktion abbrechen.
Du meinst wahrscheinlich, dass alle Befehle nach einem Return ignoriert werden?
12.02.2016, 11:48:15 via Website
12.02.2016 11:48:15 via Website
Sicher ? Wie gesagt ich hab mich da jetzt nicht reingelesen, aber wenn das vorletzte return erreicht werden würde, dann würde pupup.show(); nie aufgerufen werden.
— geändert am 12.02.2016, 11:48:35
12.02.2016, 11:49:17 via Website
12.02.2016 11:49:17 via Website
Da das erste Toast kommt liegt es an den Ifs.
Wie gesagt strings NIE mit == prüfen.
Nimm lieber die ID und machen nen switch/case drum
LG Pascal //It's not a bug, it's a feature.
12.02.2016, 12:07:43 via Website
12.02.2016 12:07:43 via Website
So, die aktuelle Version. Es tut sich noch nichts. Der Toast kommt aber wie gehabt.
Bin jetzt für ein, zwei Stunden weg.
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int pos, long id) {
Log.v("longClick", "arg0.getItemAtPosition(pos) " + arg0.getItemAtPosition(pos));
String father = ((TextView) arg1.findViewById(R.id.textViewId)).getText().toString();
mId = father;
Log.d("double click", father);
PopupMenu popup = new PopupMenu(MainActivity.this,listView);
popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
//registering popup with OnMenuItemClickListener
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(MainActivity.this, "You Clicked : " + item.getTitle(), Toast.LENGTH_SHORT).show();
switch(item.getItemId()){
case 0:
EnterNewInfo(item.getItemId());
break;
case 1:
copyInfoId(item.getItemId());
break;
case 2:
insertInfo(item.getItemId());
break;
}
return true;
}
});
popup.show();
return true;
}
});
12.02.2016, 12:09:21 via Website
12.02.2016 12:09:21 via Website
Ich versuche das nachher mal genauer mit dem Debugger zu untersuchen etc.
12.02.2016, 12:10:07 via Website
12.02.2016 12:10:07 via Website
Sind auch noch Fehler drinne
Du musst ja den case mit den R.id konstanten machen und dann die IDs nehmen, welche du in der XML hinterlegt hast
z.B.
in der xml steht
android:id="@+id\item1"
dann machst du
case R.id.item1:
//deinCode
break;
LG Pascal //It's not a bug, it's a feature.
12.02.2016, 12:11:07 via Website
12.02.2016 12:11:07 via Website
Dann dürfte es eigentlich funktionieren.
12.02.2016, 13:27:14 via Website
12.02.2016 13:27:14 via Website
Es geht!
Auch mit anschließender Anwahl von New, dem Hinzufügen eines neuen Datensatzes und anschließendem Aktualisieren der ListView.
Ich glaube, ich habe auch einiges gelernt.
Besten Dank an Euch beide!
Vorerst setze ich das Thema auf "erledigt".
— geändert am 12.02.2016, 13:29:34
12.02.2016, 13:29:33 via Website
12.02.2016 13:29:33 via Website
Sehr schön
LG Pascal //It's not a bug, it's a feature.
12.02.2016, 13:30:35 via Website
12.02.2016 13:30:35 via Website
Hey super
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.