Android Löschfunktion beim Wischen

RezaScript

Bekanntes Mitglied
Hallo,

Ich habe einen Button und möchte, dass wenn man mit dem Finger nach links wischt, der Knopf entfernt wird.

So sieht mein Knopf aus:
XML:
<Button
    android:id="@+id/hello"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:gravity="center_vertical"
    android:onClick="onClick"
    android:text="@string/hello" />

Und das ist meine Swipe-Funktion:
Java:
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        return false;
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
        builder.setTitle("Löschen");
        builder.setMessage("Möchtest du wirklich löschen?");
        builder.setPositiveButton("Ja", (dialog, which) -> {
            // Delete
        });
        builder.setNegativeButton("Nein", (dialog, which) -> {
            // Cancel
        });

        builder.show();
    }

};
Wie kann ich diese Funktion mit dem Knopf in Verbindung bringen?
 

Jw456

Top Contributor
Erkläre mal etwas genauer was du willst.

Du willst wenn du links wischt der Button nicht mehr in Layout angezeigt wird und wenn du nach rechst wischst wider da ist.
Views im Layout anzeigen und nicht anzeigen mit.

bt.setVisibility(View.VISIBLE) oder INVISIBLE

natürlich vorher den Botton mit findViewById suchen.



Für das Erkennen des Swipe würde ich eine GasteDetektor benutzen.
Schaue mal hier könnte helfen.

 
Zuletzt bearbeitet:

RezaScript

Bekanntes Mitglied
Du willst wenn du links wischt der Button nicht mehr in Layout angezeigt wird
Genau.
und wenn du nach rechst wischst wider da ist.
Nein. Wie auch? Der Button ist ja nicht mehr da. Das Wischen soll nur auf dem Button selbst stattfinden. Wenn er also weg ist, ist er weg und soll auch nicht mehr wieder zurück.

Also die Löschfunktion ist vorerst mein zweites Ziel. Mein primäres Ziel ist es erstmal, dass man den Button überhaupt wischen kann, auch wenn dabei gar nichts passiert.
 

Jw456

Top Contributor
Du kannst einen Button nicht wischen nur drücke. (Clicken)

Wenn du den Button Klickst kommst du in die onClick Methode. Dort kannst du ihn auch unsichtbar machen.

Du kannst den Button aber auch dem aus dem Link erstellten OnTouchListener geben. Beim Wisch auf ihn unsichtbar oder sogar Gone setzen.


Java:
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button bt = findViewById(R.id.hello);
        bt.setOnTouchListener(new OnSwipeTouchListener(MainActivity.this) {
            @Override
            public void onSwipeLeft() {
                super.onSwipeLeft();
                bt.setVisibility(View.INVISIBLE);
            }
        });
    }
}
 

Jw456

Top Contributor
Beachten solltest du aber das du das du dem Button nur einen Listerner geben kannst.
Also der normale onClickListener wird dann nicht mehr gehen.

Das OnClick im Layout solltest du entfernen.
Und für Click Event den aus der Klasse benutzen.
 

RezaScript

Bekanntes Mitglied
@Jw456 also ich möchte den Button nur entfernen, sobald ich den Button wische. Sobald ich darauf KLICKE, soll aber eine andere Funktion ausgeführt werden. Wenn ich dich richtig verstanden habe, ist das Wischen eines Buttons gar nicht möglich. Aber was genau ist denn mit deinem Code möglich? Einfach ein Text anstatt ein Button?

Ich habe deinen Code ausprobiert, bekomme ihn aber leider nicht zum Laufen, auch wenn ich den onClickListener entferne. Android Studio kennt OnSwipeTouchListener() nicht. Ich habe etwas gegooglet und das hier gefunden:

Java:
package ch.yourclick.kitt.classes;

import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;

public class OnSwipeTouchListener implements View.OnTouchListener {

    private final GestureDetector gestureDetector = new GestureDetector(new GestureListener());

    public boolean onTouch(final View v, final MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }

    private final class GestureListener extends GestureDetector.SimpleOnGestureListener {

        private static final int SWIPE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;


        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            boolean result = false;
            try {
                float diffY = e2.getY() - e1.getY();
                float diffX = e2.getX() - e1.getX();
                if (Math.abs(diffX) > Math.abs(diffY)) {
                    if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffX > 0) {
                            result = onSwipeRight();
                        } else {
                            result = onSwipeLeft();
                        }
                    }
                } else {
                    if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffY > 0) {
                            result = onSwipeBottom();
                        } else {
                            result = onSwipeTop();
                        }
                    }
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            return result;
        }
    }

    public boolean onSwipeRight() {
        return false;
    }

    public boolean onSwipeLeft() {
        return false;
    }

    public boolean onSwipeTop() {
        return false;
    }

    public boolean onSwipeBottom() {
        return false;
    }
}

Ist das die richtige Klasse? Ich frage deshalb, weil darauf onSwipeLeft ein boolean ist und in deinem Code ist es void.
 

Jw456

Top Contributor
Java:
import android.content.Context;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;

class OnSwipeTouchListener implements View.OnTouchListener {
    private GestureDetector gestureDetector;

    OnSwipeTouchListener(Context c) {
        gestureDetector = new GestureDetector(c, new GestureListener());
    }

    public boolean onTouch(final View view, final MotionEvent motionEvent) {
        return gestureDetector.onTouchEvent(motionEvent);
    }

    private final class GestureListener extends
            GestureDetector.SimpleOnGestureListener {
        private static final int SWIPE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            onClick();
            return super.onSingleTapUp(e);
        }

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            onDoubleClick();
            return super.onDoubleTap(e);
        }

        @Override
        public void onLongPress(MotionEvent e) {
            onLongClick();
            super.onLongPress(e);
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            try {
                float diffY = e2.getY() - e1.getY();
                float diffX = e2.getX() - e1.getX();
                if (Math.abs(diffX) > Math.abs(diffY)) {
                    if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffX > 0) {
                            onSwipeRight();
                        } else {
                            onSwipeLeft();
                        }
                    }
                } else {
                    if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffY > 0) {
                            onSwipeDown();
                        } else {
                            onSwipeUp();
                        }
                    }
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            return false;
        }
    }

    public void onSwipeRight() {
    }

    public void onSwipeLeft() {
    }

    private void onSwipeUp() {
    }

    private void onSwipeDown() {
    }

    public  void onClick() {
    }

    private void onDoubleClick() {
    }

    private void onLongClick() {
    }
}
Java:
Button bt = findViewById(R.id.hello);

        bt.setOnTouchListener(new OnSwipeTouchListener(MainActivity.this) {
            @Override
            public void onSwipeLeft() {
                super.onSwipeLeft();
                bt.setVisibility(View.GONE);
            }
            @Override
            public void onClick(){
                Toast.makeText(MainActivity.this ,"Löschen", Toast.LENGTH_SHORT).show();
                      
            }

        });

PS das sind zwei Datein.
 
Zuletzt bearbeitet:

RezaScript

Bekanntes Mitglied
@Jw456 oh wow, das klappt ja wunderbar! Herzlichen Dank!
Wenn ich nach links wische, ist der Button plötzlich weg. Gibt es auch eine Möglichkeit eine Animation einzubinden, so dass man sieht, dass der Button nun weggewischt wird?
 

Jw456

Top Contributor
Klar sollte soetwas gehn.
Dann schaue dir an welche Animationen von Views es gibt.
Den Listener zum starten hast du ja nun.
Wenn es nicht mit einem Button geht dann benutze ein Imageview.
Dazu solltest du genügend Code finden.
 

RezaScript

Bekanntes Mitglied
Also die Animation habe ich so gemacht:
Java:
@Override
public void onSwipeLeft() {
    super.onSwipeLeft();
    btn.animate()
        .translationX(-btn.getWidth())
        .alpha(0.0f)
        .setDuration(300)
        .setListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                btn.clearAnimation();
                btn.setVisibility(View.GONE);
            }
        });
}
Schade, dass die Animation erst ausgeführt wird, nachdem ich nach links gewischt habe und nicht während ich wische, aber gut, immerhin etwas 😅
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Rand ändern beim ImageView bei Picasso Android & Cross-Platform Mobile Apps 1
Arif Android Android Studio: Fehler beim Einbinden fremder Bibliothek? Android & Cross-Platform Mobile Apps 2
L App stürtzt ab beim öffnen Android & Cross-Platform Mobile Apps 1
JavaWolf165 Android Fehler beim Speichern/Downloaden einer Datei Android & Cross-Platform Mobile Apps 2
S Android Probleme beim Verbinden mit einer HTTPS Seite Android & Cross-Platform Mobile Apps 4
M Android Fehler beim Parsen. Android & Cross-Platform Mobile Apps 29
V Android Fehlermeldung beim Öffnen von Eclipse nach Installation der Android Erweiterung Android & Cross-Platform Mobile Apps 4
M Error beim drücken der Zurück-Taste am Handy Android & Cross-Platform Mobile Apps 2
S Fehler beim Textdatei einlesen!? Android & Cross-Platform Mobile Apps 7
A Fehlermeldung beim ändern der ViewGroup. Android & Cross-Platform Mobile Apps 6
H Buttons färben sich mit, beim Hintergrund ändern Android & Cross-Platform Mobile Apps 3
A Mehrere Fehler beim Compilieren Android & Cross-Platform Mobile Apps 4
G Problem beim Rendern von 3D-Objekt Android & Cross-Platform Mobile Apps 0
L Android OutOfMemory beim erneuten Starten der App Android & Cross-Platform Mobile Apps 2
N Android Retain Dialog verschwindet beim drehen Android & Cross-Platform Mobile Apps 4
B Android GameLoopThread stürzt beim 2ten start der App ab? Android & Cross-Platform Mobile Apps 4
K Nullpointer beim Löschen von Datenbankeintrag, je nachdem wo der Befehl steht Android & Cross-Platform Mobile Apps 5
S Java ME Exception beim Abspielen von Musik Android & Cross-Platform Mobile Apps 6
G Fehler beim Import "Invalid project description" Android & Cross-Platform Mobile Apps 2
G unterschiedliches Verhalten beim Installieren des App auf dem Smartphone Android & Cross-Platform Mobile Apps 3
K Android schwarzer Bildschirm beim Rendern von Text und Dreiecken Android & Cross-Platform Mobile Apps 9
DaniSahne96 Problem beim Appdebuggen auf Smartphone Android & Cross-Platform Mobile Apps 3
P Android Problem beim Widget - Denkfehler ? Android & Cross-Platform Mobile Apps 2
A Fehler beim Starten eines Intents - alles in einer Klasse funktioniert... Android & Cross-Platform Mobile Apps 4
J Android Verhalten beim Hinzufügen neuer Views? Android & Cross-Platform Mobile Apps 6
S Android Fehler beim Anzeigen meines Apps auf Galaxy Tab Android & Cross-Platform Mobile Apps 4
G Beziehung von THIS beim Imageadapter und AsyncTask Android & Cross-Platform Mobile Apps 7
V [Java] und [JavaME] ClientServer StreamConnection . Problem beim lesen / schreiben Android & Cross-Platform Mobile Apps 2
R Ein Problem beim ausführen von folgendem Quelltext Android & Cross-Platform Mobile Apps 11
N Error in HTTP operation beim KXML parsen Android & Cross-Platform Mobile Apps 7
A Problem beim Subtrahieren eines Double von einem Double Android & Cross-Platform Mobile Apps 5
G fehldermeldung beim klicken auf "build" Android & Cross-Platform Mobile Apps 8
L SecurityException beim lesen/schreiben eine Datei Android & Cross-Platform Mobile Apps 7
F Problem beim Erstellen der Jar File Android & Cross-Platform Mobile Apps 4
S createPlayer beim Entwickeln Android & Cross-Platform Mobile Apps 6
H Android Mit Animation den ContentView zur Seite wischen Android & Cross-Platform Mobile Apps 3

Ähnliche Java Themen

Neue Themen


Oben