App stürzt ab ,wenn der Bildschirm berührt wird

  • Antworten:3
  • Bentwortet
Draz
  • Forum-Beiträge: 6

13.05.2019, 19:46:44 via Website

Hallo,
mir ist beim programmieren einer App ein Fehler unterlaufen.
Ich schaffe es nicht das Problem zu lösen und hoffe hier auf Hilfe.
Danke im vorraus.

Hier der Code;

package com.example.buggy;

import android.annotation.SuppressLint;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;

import java.util.Random;

import static com.example.buggy.R.drawable.kaefer;


public class MainActivity extends AppCompatActivity {

    private int xStart, yStart, xZiel, yZiel;
    private int xLinks, yOben, xRechts, yUnten;
    private double Winkel;
    private Boolean An = true;
    private ImageView Insekt;
    private Handler handler = new Handler();

    private void setLimits(){
        xLinks = 35;
        yOben = 35;
        xRechts = (int) (getResources().getDisplayMetrics().widthPixels* 0.74f);
        yUnten = (int) (getResources().getDisplayMetrics().heightPixels* 0.74f);
    }

    private void setDestination(){
        Random Zufall = new Random();
        xZiel = Zufall.nextInt(xRechts);
        yZiel = Zufall.nextInt(yUnten);
    }

    private void getDirection(){
        // Distanz ermtteln
        int xDiff = xZiel - xStart;
        int yDiff = yZiel - yStart;
        // Winkel berechnen
        Winkel = Math.atan2(xDiff, -yDiff);
        Winkel = Math.toDegrees(Winkel);
    }

    private void moveObject(ImageView view){
        // Ziel-Position setzen
        setDestination();
        // Richtung ermitteln
        getDirection();
        // Objekt holen und drehen und verschieben
        view.setImageResource(kaefer);
        view.setRotation((float)Winkel);
        view.animate().x(xZiel).y(yZiel).setDuration(500);
        // Startpunk neu setzen
        xStart = xZiel;
        yStart = yZiel;
    }

    private Runnable runnable;

    {
        runnable = new Runnable() {
            @Override
            public void run() {
                moveObject(Insekt);
                handler.postDelayed(this, 500);
            }
        };
    }

    @SuppressLint("ClickableViewAccessibility")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Komponente
        ImageView Insekt = (ImageView) findViewById(R.id.imageView);
        final ImageView Hgrund = (ImageView) findViewById(R.id.imageView2);

        // Displaygrenzen
        setLimits();

        xStart = xRechts/2;
        yStart = yUnten/2;

        Hgrund.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                // Auftrag übernehmen/ausführen
                if (An)
                    handler.post(runnable);
                    // Auftrag beenden
                else
                    handler.removeCallbacks(runnable);
                // Umschalten
                An = !An;
                // Rückgabewert
                return false;
            }
        });
    }
}
Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.530

13.05.2019, 21:00:15 via Website

Hallo ohne mir jetzt genau deinen Code angesehen zu haben.

Im Klassen Rumpf solltest du keine Instanz erstellen.

im Rumpf
private Handler handler;

in der onCrate
handler = new Handler();

Bei android keine Statement im Klassenrumpf

PS. der Sinn dieser Zeile erschließt sich mir leider nicht
"import static com.example.buggy.R.drawable.kaefer;"

auch diesen Code finde ich seltsam
erst eine Variable erstellen und dann ein Block ohne einen Bezug.
Der Blog befindet sich somit auch im klassenrumpf.

private Runnable runnable;

{
    runnable = new Runnable() {
        @Override
        public void run() {
            moveObject(Insekt);
            handler.postDelayed(this, 500);
        }
    };
}

auch verstehe ich nicht warum dun das "MotionEvent motionEvent" brauchst.

Hgrund.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {

— geändert am 13.05.2019, 22:51:32

Hilfreich?
Draz
Kommentieren
Draz
  • Forum-Beiträge: 6

14.05.2019, 15:21:14 via Website

Vielen Dank Jokel für deine Antwort!
Das Problem lag an der Runnable, weil ich sie nicht in der onCreate erstellt habe.

— geändert am 14.05.2019, 15:21:45

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

14.05.2019, 16:17:33 via Website

Ja wie gesagt keine Statements im klassenrumpf. Der Block die geschweiften klammern befinden sich somit auch im klassenrumpf. Wenn du keine Methode erstellst ist der Block so zusagen im klassenrumpf was bei android nicht geht.

Dabei ist es egal ob das am anfang der Klasse ist oder dazwischen. Alles ohne einer Methoden Definitionen ist im klassenrumpf.

Hilfreich?
Kommentieren