2013-03-11 4 views
1

Je veux que le bouton1,2,3 répondre à un longclick, l'utilisateur sera invité à entrer le bouton du texte. A l'intérieur de onCreate je l'ai écrit:setonlongclicklistener pour plusieurs boutons à la fois

Button botonEditable; 
Context context; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ... 
    context = MainActivity.this; 
    Resources r = getResources(); 
    String pName = getPackageName(); 

    for (int i=1;i<4;i++){ 
    botonEditable = (Button) findViewById(r.getIdentifier("button" + i, "id", pName)); 
    botonEditable.setOnLongClickListener(new View.OnLongClickListener() { 
     public boolean onLongClick(View v) { 
      final AlertDialog.Builder alert = new AlertDialog.Builder(context); 
      alert.setMessage("Nueva Categoria:"); 
      final EditText input = new EditText(context); 
      alert.setView(input); 
      alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton ) { 
        // Do something with value! 
        String newCateg = input.getText().toString(); 
        botonEditable.setText(newCateg); 
       } 
      }); 

      alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 
        // Canceled. 
       } 
      });   
      alert.show();     
      return true; 
     } 
    }); 
    } 
} 

Lorsque cela est testé, les 3 boutons répond en conséquence pour afficher un message d'alerte, mais quand j'entrer du texte et cliquez sur OK, le texte est modifié que dans button3, quelle que soit la bouton a été longclicked :( Qu'est-ce qui ne va pas et comment le fixer de manière simple?

+0

Hors champ: Pourquoi Entreposez-vous une forte référence au contexte de l'activité? Je crois que c'est une mauvaise pratique, supprimez l'attribut ** Context context ** et utilisez ** this ** si nécessaire. – Leeeeeeelo

Répondre

0

J'ai trouvé la solution, dans mon code que je viens de remplacer la ligne

public boolean onLongClick(View v) {.... 

par celui-ci

public boolean onLongClick(final View v) {.... 

ainsi que vos suggestions:

((Button)v).setText(newCateg.toUpperCase()); 

Maintenant, tout va bien. Merci les gars, votre aide m'a laissé à des millimètres de la solution.
:)

1

Essayez cette

button.setOnLongClickListener(new longClcik()); 


class longClcik implements OnLongClickListener { 

    public boolean onLongClick(View v) { 
     return false; 

    } 
} 
1

Try this .. Remplacer le code suivant

public void onClick(DialogInterface dialog, int whichButton ) { 
        // Do something with value! 
        String newCateg = input.getText().toString(); 
        botonEditable.setText(newCateg); 
       } 

avec

public void onClick(DialogInterface dialog, int whichButton ) { 
        // Do something with value! 
        String newCateg = input.getText().toString(); 
        ((Button)v).setText(newCateg); 
       } 
1

Vous devez utiliser le View transmis au OnLongClickListener. Cela vous donnera la vue actuellement cliqué et mettre à jour sa valeur si la place faire

botonEditable.setOnLongClickListener(new View.OnLongClickListener() { 
    public boolean onLongClick(View v) { 
     final AlertDialog.Builder alert = new AlertDialog.Builder(context); 
     alert.setMessage("Nueva Categoria:"); 
     final EditText input = new EditText(context); 
     alert.setView(input); 
     alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton ) { 
       // Do something with value! 
       String newCateg = input.getText().toString(); 
       ((Button)v).setText(newCateg); //<-- see the botonEditable changed to v 
      } 
     }); 

     alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       // Canceled. 
      } 
     });   
     alert.show();     
     return true; 
    } 
}); 
+0

Ne fonctionne pas. J'ai essayé vos suggestions les gars, @Praful Bhatnagar, mais Eclipse se plaint "Impossible de se référer à une variable non finale v dans une classe interne définie dans une méthode différente". C'est pourquoi j'ai défini botonEditable comme une variable globale, cela est vu par toutes les méthodes, ai-je raison? Je suis juste un développeur android intuitif. Je sais que je dois en savoir plus sur Java. – JoeCoolman

+0

Ouais bien sur j'ai oublié de faire le View final! – Neil

0

-je le faire de cette façon:

  1. D'abord u doivent mettre en œuvre à votre classe View.OnLongClickListener
  2. Deuxième méthode de overide onLongClick

    @Override
    public booléen onLongClick (Afficher v) {
    onChe ckboxLongClicked (v);
    return true;
    }

  3. méthode Create onCheckBoxLongClicked qui est vide. Ou u peut mettre en œuvre ur swith à l'intérieur onLongClick

    interrupteur (view.getId()) {
    R.id.cbDigits de cas:
    Toast.makeText (getActivity(), "Message", Toast.LENGTH_SHORT) .montrer();
    pause;
    .
    .
    .
    }

Désolé, mais je ne sais toujours pas comment formater code pour obtenir tiret ...

+0

Merci Maruban, je vais prendre votre suggestion en considération pour les travaux futurs. Maintenant, j'ai affaire à Blender et VBA Excel, donc plusieurs projets Android sont maintenant retardés mais je les prendrai bientôt. – JoeCoolman

Questions connexes