[Android] EventHandling über Gestures bricht sofort ab

Gismodin

Cadet 3rd Year
Registriert
Mai 2013
Beiträge
32
Hallo,

nachdem ich das Java Tutorial durch habe, habe ich nun mit Android begonnen. Dafür verfolge ich dieses Tutorial (Episode 21 und 22).
Mein Problem ist jetzt aber, dass sobald ich die App auf meinem Handy starte, irgendeine Aktion ausführe, die App sofort beendet wird.
Die einzige Aktion die ausgeführt wird, ist die OnLongClick-Aktion des Buttons, aber sobald ich den Button loslasse, bricht auch hier die App ab.
Sieht jemand meinen Fehler?

Code:
package com.example.eventhandling;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.view.MotionEvent;
import android.view.GestureDetector;
import android.support.v4.view.GestureDetectorCompat;


public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener,
GestureDetector.OnDoubleTapListener{

    private TextView txtMain;
    private GestureDetectorCompat gestureDetector;

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

        Button btnMain = (Button)findViewById(R.id.btnMain);                                       
        TextView txtMain = (TextView)findViewById(R.id.txtMain);
        this.gestureDetector = new GestureDetectorCompat(this, this);
        gestureDetector.setOnDoubleTapListener(this);

        BtnMainClickHandler click = new BtnMainClickHandler();                                      
        btnMain.setOnClickListener(click);                                                          
        BtnMainLongClickHandler longClick = new BtnMainLongClickHandler();                          
        btnMain.setOnLongClickListener(longClick);

    }

    // Methods of GestureDetector.OnDoubleTapListener
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        txtMain.setText("onSingleTapConfirmed");
        return true;
    }

    @Override
    public boolean onDoubleTap(MotionEvent e) {
        txtMain.setText("onDoubleTap");
        return true;
    }

    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        txtMain.setText("onDoubleTapEvent");
        return true;
    }


    // Methods of GestureDetector.OnGestureListener

    @Override
    public boolean onDown(MotionEvent e) {
        txtMain.setText("onDown");
        return true;
    }

    @Override
    public void onShowPress(MotionEvent e) {
        txtMain.setText("onShowPress");
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        txtMain.setText("onSingleTapConfirmed");
        return true;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        txtMain.setText("onScroll");
        return true;
    }

    @Override
    public void onLongPress(MotionEvent e) {
        txtMain.setText("onLongPress");
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        txtMain.setText("onFling");
        return true;
    }

    //////////// End Gestures ////////////

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        this.gestureDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }


    // Listeners for 'btnMain'

    public class BtnMainClickHandler implements View.OnClickListener{

        @Override
        public void onClick(View v) {
            txtMain.setText("Gut gemacht!");
        }
    }


    public class BtnMainLongClickHandler implements View.OnLongClickListener{

        @Override
        public boolean onLongClick(View v) {
            TextView txtMain = (TextView)findViewById(R.id.txtMain);
            txtMain.setText("Drück mal nicht so lang!");
            return false;
        }
    }
}

Gruß

Gismodin
 
Zuletzt bearbeitet:
Jetzt musste ich erst nochmal suchen, wo ich das finde. Im logcat kommt diese Fehlermeldung:

fehler1.PNG
fehler2.PNG
fehler3.PNG

08-07 11:48:00.603 22643-22643/? E/Zygote: v2
08-07 11:48:00.603 22643-22643/? I/libpersona: KNOX_SDCARD checking this for 10072
08-07 11:48:00.603 22643-22643/? I/libpersona: KNOX_SDCARD not a persona
08-07 11:48:00.604 22643-22643/? E/Zygote: accessInfo : 0
08-07 11:48:00.605 22643-22643/? W/SELinux: SELinux selinux_android_compute_policy_index : Policy Index[2], Con:u:r:zygote:s0 RAM:SEPF_SECMOBILE_7.0_0005, [-1 -1 -4 -1 0 1]
08-07 11:48:00.606 22643-22643/? I/SELinux: SELinux: seapp_context_lookup: seinfo=untrusted, level=s0:c512,c768, pkgname=com.example.eventhandling
08-07 11:48:00.609 22643-22643/? I/art: Late-enabling -Xcheck:jni
08-07 11:48:00.622 22643-22643/? D/TimaKeyStoreProvider: TimaKeyStore is not enabled: cannot add TimaSignature Service and generateKeyPair Service
08-07 11:48:00.647 22643-22650/? I/art: Debugger is no longer active
08-07 11:48:00.647 22643-22650/? I/art: Starting a blocking GC Instrumentation
08-07 11:48:00.710 22643-22643/? W/System: ClassLoader referenced unknown path: /data/app/com.example.eventhandling-1/lib/arm64
08-07 11:48:00.723 22643-22643/? I/InstantRun: starting instant run server: is main process
08-07 11:48:00.772 22643-22643/? W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
08-07 11:48:00.871 22643-22643/? D/ViewRootImpl@b038031[MainActivity]: ThreadedRenderer.create() translucent=false
08-07 11:48:00.874 22643-22643/? D/InputTransport: Input channel constructed: fd=70
08-07 11:48:00.874 22643-22643/? D/ViewRootImpl@b038031[MainActivity]: setView = DecorView@872b316[MainActivity] touchMode=true
08-07 11:48:00.891 22643-22643/? D/ViewRootImpl@b038031[MainActivity]: dispatchAttachedToWindow
08-07 11:48:00.904 22643-22643/? D/ViewRootImpl@b038031[MainActivity]: Relayout returned: oldFrame=[0,0][0,0] newFrame=[0,0][1440,2560] result=0x7 surface={isValid=true 495802754560} surfaceGenerationChanged=true
08-07 11:48:00.904 22643-22643/? D/ViewRootImpl@b038031[MainActivity]: mHardwareRenderer.initialize() mSurface={isValid=true 495802754560} hwInitialized=true
08-07 11:48:00.915 22643-22659/? D/libEGL: loaded /vendor/lib64/egl/libGLES_mali.so
08-07 11:48:00.927 22643-22643/? W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
08-07 11:48:00.931 22643-22643/? D/ViewRootImpl@b038031[MainActivity]: MSG_RESIZED_REPORT: ci=Rect(0, 96 - 0, 0) vi=Rect(0, 96 - 0, 0) or=1
08-07 11:48:00.931 22643-22643/? D/ViewRootImpl@b038031[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 1
08-07 11:48:00.931 22643-22643/? D/ViewRootImpl@b038031[MainActivity]: mHardwareRenderer.initializeIfNeeded()#2 mSurface={isValid=true 495802754560}
08-07 11:48:00.932 22643-22643/? V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@a8ec684 nm : com.example.eventhandling ic=null
08-07 11:48:00.932 22643-22643/? I/InputMethodManager: [IMM] startInputInner - mService.startInputOrWindowGainedFocus
08-07 11:48:00.933 22643-22659/? I/OpenGLRenderer: Initialized EGL, version 1.4
08-07 11:48:00.933 22643-22659/? D/OpenGLRenderer: Swap behavior 1
08-07 11:48:00.934 22643-22655/? D/InputTransport: Input channel constructed: fd=76
08-07 11:48:00.937 22643-22659/? D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000, [1440x2560]-format:1
08-07 11:48:00.959 22643-22643/? V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@d5eee6d nm : com.example.eventhandling ic=null
08-07 11:48:15.411 22643-22643/com.example.eventhandling D/ViewRootImpl@b038031[MainActivity]: ViewPostImeInputStage processPointer 0
08-07 11:48:15.412 22643-22643/com.example.eventhandling W/System: ClassLoader referenced unknown path: /system/framework/QPerformance.jar
08-07 11:48:15.413 22643-22643/com.example.eventhandling E/BoostFramework: BoostFramework() : Exception_1 = java.lang.ClassNotFoundException: Didn't find class "com.qualcomm.qti.Performance" on path: DexPathList[[],nativeLibraryDirectories=[/system/lib64, /vendor/lib64]]
08-07 11:48:15.413 22643-22643/com.example.eventhandling V/BoostFramework: BoostFramework() : mPerf = null
08-07 11:48:15.414 22643-22643/com.example.eventhandling E/InputEventReceiver: Exception dispatching input event.
08-07 11:48:15.414 22643-22643/com.example.eventhandling E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
08-07 11:48:15.415 22643-22643/com.example.eventhandling E/MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at com.example.eventhandling.MainActivity.onDown(MainActivity.java:60)
at android.view.GestureDetector.onTouchEvent(GestureDetector.java:605)
at android.support.v4.view.GestureDetectorCompat$GestureDetectorCompatImplJellybeanMr2.onTouchEvent(GestureDetectorCompat.java:479)
at android.support.v4.view.GestureDetectorCompat.onTouchEvent(GestureDetectorCompat.java:542)
at com.example.eventhandling.MainActivity.onTouchEvent(MainActivity.java:96)
at android.app.Activity.dispatchTouchEvent(Activity.java:3239)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:521)
at android.view.View.dispatchPointerEvent(View.java:10946)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5110)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4962)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4493)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4546)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4512)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4645)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4520)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4702)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4493)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4546)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4512)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4520)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4493)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7000)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6929)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6890)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7110)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:323)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:6682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
08-07 11:48:15.416 22643-22643/com.example.eventhandling D/AndroidRuntime: Shutting down VM
08-07 11:48:15.417 22643-22643/com.example.eventhandling E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.eventhandling, PID: 22643
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at com.example.eventhandling.MainActivity.onDown(MainActivity.java:60)
at android.view.GestureDetector.onTouchEvent(GestureDetector.java:605)
at android.support.v4.view.GestureDetectorCompat$GestureDetectorCompatImplJellybeanMr2.onTouchEvent(GestureDetectorCompat.java:479)
at android.support.v4.view.GestureDetectorCompat.onTouchEvent(GestureDetectorCompat.java:542)
at com.example.eventhandling.MainActivity.onTouchEvent(MainActivity.java:96)
at android.app.Activity.dispatchTouchEvent(Activity.java:3239)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:521)
at android.view.View.dispatchPointerEvent(View.java:10946)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5110)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4962)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4493)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4546)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4512)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4645)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4520)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4702)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4493)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4546)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4512)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4520)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4493)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7000)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6929)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6890)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7110)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:323)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:6682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

Ich denke der Fehler wird dann das hier sein:
08-07 11:48:15.413 22643-22643/com.example.eventhandling E/BoostFramework: BoostFramework() : Exception_1 = java.lang.ClassNotFoundException: Didn't find class "com.qualcomm.qti.Performance" on path: DexPathList[[],nativeLibraryDirectories=[/system/lib64, /vendor/lib64]]
08-07 11:48:15.413 22643-22643/com.example.eventhandling V/BoostFramework: BoostFramework() : mPerf = null
08-07 11:48:15.414 22643-22643/com.example.eventhandling E/InputEventReceiver: Exception dispatching input event.
08-07 11:48:15.414 22643-22643/com.example.eventhandling E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
08-07 11:48:15.415 22643-22643/com.example.eventhandling E/MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

Nur hab ich keine Ahnung, was das bedeuten soll. Die Klasse die fehlen soll, wird im Tutorial ja auch nie hinzugefügt
 
Zuletzt bearbeitet:
Doch, . Textview.setText rufst du doch auf.

Auf deine Textview-Variable kann er aber nicht zugreifen. Ich kenn mich mit Android jetzt nicht aus, würde aber davon ausgehen, dass du diese Variable public machen musst?
PS: lange Log-Einträge kannst du am besten zwischrn 'spoiler' - Tags setzen.
Dann muss man nicht so weit scrollen

Lg, Franz
 
Daran liegts leider nicht, eben mit beiden Variablen ausprobiert. Im Tutorial werden übrigens auch private-Variablen verwendet
 
Ich würde mal Zeile 25 anschauen.

Code:
TextView txtMain = (TextView)findViewById(R.id.txtMain);

Dort erstellst du ein neues (lokales) Objekt "txtMain", ergo weißt du deiner privaten Member-Variable txtMain nichts zu! Entfernst du das "TextView" vor "txtMain" sollte es funktionieren oder nutze "this.txtMain".

Code:
txtMain = (TextView)findViewById(R.id.txtMain);
 
Gismodin schrieb:
Jetzt musste ich erst nochmal suchen, wo ich das finde. Im logcat kommt diese Fehlermeldung:

Anhang anzeigen 636448


Nur hab ich keine Ahnung, was das bedeuten soll. Die Klasse die fehlen soll, wird im Tutorial ja auch nie hinzugefügt

Etwas Grundlegendes:

Immer wenn du die rote Schrift siehst, ist ein Fehler ausgeworfen worden.
Such dann nach dem ersten Link, der dunkelblau unterlegt ist, in deinem Fall (MainActivity.java: 60)
und klick dort drauf. Dort liegt dann meist der Fehler.


Ocram 1992 hat es korrekt beschrieben.
In Line 16 deklarierst du einen TextView txtMain.
In Line 25 erstellst du einen neuen TextView.
Um den obigen TextView txtMain anzusprechen,
musst du das TextView in Zeile 25 entfernen.
 
Ah, vielen Dank! Das probier ich gleich mal aus. Manchmal sollte man halt doch immer ein neues Programm erstellen, dann passieren solche Editierfehler nicht :rolleyes:

Edit: Hat geklappt, danke
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben