2017-08-21 4 views
0

J'ai une MainActivity où la majeure partie de mon code est écrite. J'ai une imageview dans mon activity_main.xml que je mets à une image par défaut dans Mainactivity. Mon autre fichier "OnSwipeTouchListener" est à l'écoute des événements swipe et double tap, j'ai écrit le code pour changer l'image de l'imageview lorsque l'utilisateur tape deux fois mais mon code ne fonctionne pas, ni aucune erreur. (J'utilise Layoutinflater pour gonfler le fichier activity_main).Impossible de changer l'image d'Imageview d'une autre classe

Voici le OnSwipeTouchListener

package com.backspace.memebook; 
 

 
import android.content.Context; 
 
import android.view.GestureDetector; 
 
import android.view.GestureDetector.SimpleOnGestureListener; 
 
import android.view.LayoutInflater; 
 
import android.view.MotionEvent; 
 
import android.view.View; 
 
import android.view.View.OnTouchListener; 
 
import android.widget.ImageView; 
 

 
public class OnSwipeTouchListener extends MainActivity implements OnTouchListener { 
 

 
    private final GestureDetector gestureDetector; 
 
    public Context ctx; 
 

 
    public OnSwipeTouchListener (Context ctx){ 
 
     gestureDetector = new GestureDetector(ctx, new GestureListener()); 
 
     this.ctx = ctx; 
 
    } 
 

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

 
    private final class GestureListener extends 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 onDoubleTap(MotionEvent e) { 
 
      System.out.println("double tap"); 
 
      LayoutInflater mInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
 
      View view = mInflater.inflate(R.layout.activity_main, null); 
 
      ImageView isFunny = (ImageView) view.findViewById(R.id.isFunny); 
 
      isFunny.setImageResource(R.drawable.funny); 
 
      return super.onDoubleTap(e); 
 
     } 
 
    } 
 

 
}

MainActivity n'a pas beaucoup de code, il définit simplement une image par défaut du imageview qui montre bien mais lorsque je tente de le changer en utilisant un autre classe, ça ne change pas.

ANybody a des indices?

+0

Vous devez gonfler et stocker la référence à la vue dans votre MainActivity. Moyens: onCreate() stocke la vue accessible depuis votre GestureListener. –

Répondre

1

Comme écrit dans un commentaire, vous devez gonfler la vue dans votre activité. Quelque chose comme ça devrait fonctionner (non testé)

public class MainActivity extends Activity { 
public ImageView iv = null; 
public void onCreate(....) { 
    setContentView(...); 
    iv = findViewById(....); 
} 

public class OnSwipeTouchListener extends MainActivity implements OnTouchListener { 
    //public ImageView iv from MainActivity 
    public OnSwipeTouchListener (Context ctx){ 
     gestureDetector = new GestureDetector(ctx, new GestureListener()); 
    } 

    private final class GestureListener extends SimpleOnGestureListener { 

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

     @Override 
     public boolean onDoubleTap(MotionEvent e) { 
      iv.setImageResource(R.drawable.funny); //iv is accessable, you may also use a constructor to pass the reference. 
      return super.onDoubleTap(e); 
     } 
    } 
} 

Vous voudrez peut-être passer la référence à votre ImageView dans le constructeur de votre GestureListener au lieu d'accéder aux données de OnSwipeTouchListener

0

Vous êtes en train de gonfler à nouveau votre disposition dans une vue qui n'est pas présente dans votre activité. Vous devez utiliser findViewById dans onCreate après setContentView et changer l'arrière-plan ImageView dans votre onDoubleTap().

+0

'utilise findViewById dans onCreate'. Peut être fait dans onDoubleTab() aussi. – greenapps

+0

@greenapps Oui, mais ce n'est pas une bonne pratique car si vous utilisez findViewById dans onCreate, cela sera fait une fois, si vous utilisez findViewById dans onDoubleTap(), cela sera fait à chaque fois que l'utilisateur tape imageview. –