2015-04-14 5 views
0

J'utilise un CircleButton de la bibliothèque MaterialWidget. Dans mon fragment, j'essaie d'utiliser un LongClickListener sur ce composant, mais cela ne fonctionne pas. Un ClickListener fonctionne mais pas le long.CircleButton LongClickListener non déclenché

Lib: https://github.com/keithellis/MaterialWidget/blob/master/library/src/main/java/com/material/widget/CircleButton.java

Il travaille avec un bouton standard.

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

    final View rootView = inflater.inflate(R.layout.fragment_home_home, container, false); 

    rootView.findViewById(R.id.cb_startPhotoe).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (isLongClickReleased) { 
       Intent i = new Intent(getActivity(), NavigationActivity.class); 
       i.putExtra("fake", 1); 
       startActivity(i); 
      } 
     } 
    }); 

    rootView.findViewById(R.id.cb_startPhotoe).setOnLongClickListener(new View.OnLongClickListener() { 

     @Override 
     public boolean onLongClick(View v) { 
      isLongClickReleased = false; 
      displayMenu(rootView); 
      return true; 
     } 
    }); 
    return rootView; 
} 

Lorsque je vois le code de la lib, rien de spécial ne m'apparaît. En mode débogage, l'écouteur n'est pas déclenché Même si je commente OnClickListener, rien ne fonctionne.

Répondre

1

Je n'utilise pas la bibliothèque particulière mais j'ai lu le code et trouvé que dans la méthode onTouchEvent, performClick() est appelée une fois dans le bloc de cas MOTION_UP. C'est ce qui déclenche votre OnClickListener. Par conséquent, pour un clic long, vous devez insérer dans cette méthode performLongClick() qui convient à vos besoins.

Voici mon idée de faire un clic long. C'est assez simple mais vous devez personnaliser cette classe CircleButton. Donc, ajoutez une variable de classe dire long tsDown;

private long tsDown; 

@Override 
public boolean onTouchEvent(@NonNull MotionEvent event) { 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      ... 
      tsDown = System.currentTimeMillis(); 
      break; 
     case MotionEvent.ACTION_UP: 
      ... 
      if (!mMoveOutside) { 
       long tsUp = System.currentTimeMillis(); 
       if (tsUp - tsDown < 1000){ 
        // if press duration is below 1s      
        performClick(); 
       }else{ 
        performLongClick(); 
       } 
      } 
      break; 

    } 
    return true; 
} 
+0

Ok merci, j'ai raté! Que faire si j'ai les 2 événements à gérer pour 2 actions différentes? Devrait réimplement un comportement de clic court/long? – Anthony

+0

Eh bien, j'ai une idée sommaire de la façon d'intégrer les deux types de clics. Je vais juste modifier ma réponse – inmyth