web-dev-qa-db-fra.com

Android: événement de clic sur un bouton

J'ai 2 boutons dans mon fichier xml avec RelativeLayout. Dans ma classe, j'ai étendu Dialog & implemetned OnClickListener et j'ai également ajouté la méthode OnClick (View v). Mais d'une manière ou d'une autre, le code onClick n'est jamais exécuté lorsque le bouton est cliqué. Quelqu'un peut-il m'aider à trouver le problème avec mon code:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:layout_width="fill_parent"
Android:layout_height="wrap_content" Android:orientation="vertical"  
Android:padding="10px">

    ......
    <Button Android:id="@+id/saveBtn_settingDlg" Android:layout_width="wrap_content" 
    Android:layout_height="wrap_content" Android:layout_below="@+id/editText1"
    Android:layout_marginLeft="10px" Android:text="Save" />

    <Button Android:id="@+id/closeBtn_settingDlg" Android:layout_width="wrap_content" Android:layout_height="wrap_content" 
      Android:text="Close" Android:layout_alignBaseline="@+id/saveBtn_setting" 
      Android:layout_toRightOf="@+id/saveBtn_setting" Android:onClick="CloseDialog"  />

Classe

 public class SettingDialog extends Dialog implements OnClickListener {

private Button btn_save, btn_close;

           // In Constructor
    btn_save = (Button) findViewById(R.id.saveBtn_settingDlg);
    btn_close = (Button) findViewById(R.id.closeBtn_settingDlg);
    btn_save.setOnClickListener(this);
    btn_close.setOnClickListener(this);

@Override
public void onClick(View v) {
    if (v == btn_save) 
        SaveSettings();
    else if (v == btn_close)
        CloseDialog();

    return;
}

private void CloseDialog() {
    disposeAll();
    this.dismiss();
}

public void CloseBtnClicked(View v) {
    CloseDialog();
}

En xml pour close btn, j'ai également essayé CloseBtnClicked mais aucune différence et j'obtiens un message UneattenduErreur et l'application s'arrête. D'une manière ou d'une autre, l'événement n'est activé d'aucune façon. Et aussi en ajoutant onClick pour fermer, le bouton est maintenant affiché en haut à gauche de l'écran et a perdu son emplacement réel.

Appel de SettingDialog à partir de la classe Activity:

    private void OpenSettingDialog() {

    AlertDialog.Builder ad = new AlertDialog.Builder(this);
    ad.setIcon(R.drawable.ic_dialog_small);

    View inflatedView = LayoutInflater.from(this).inflate(R.layout.settings_dialog, null); 
    ad.setView(inflatedView);

    AlertDialog adlg = ad.create();     
    adlg.show();

}

Quelqu'un peut-il m'aider à connaître la raison de ce problème et comment le résoudre? Je suis un débutant sur Android.

Merci

13
Tvd

Solution à mon problème:

Au lieu d'utiliser AlertBuilder et AlertDialog, je viens d'appeler la boîte de dialogue comme:

    SettingDialog sd = new SettingDialog(this, mySettings);
sd.show();

Et cela a bien fonctionné. Tous les événements de clic ont été gérés uniquement dans SettingDialog. Aucune modification ne devait être apportée dans SettingDialog. Seul le moyen d'appeler SettingDialog est modifié dans l'activité. C'est ça.

BTW, dans onClick () comapring une vue avec son nom:

    public void onClick(View v) {
    Log.i("APP: ", "Into OnClick of SettingDialog. View = " + v);
    if (v == btn_save) 
        SaveSettings();
    else if (v == btn_close) 
        CloseDialog();

    return;
}

Fonctionne également parfaitement. J'utilise cette méthode uniquement et cela fonctionne bien. Pas besoin de vérifier avec l'ID uniquement.

J'espère que ma solution aidera ceux qui sont coincés comme moi. Merci à tous pour vos efforts et votre aide.

1
Tvd

Vous devriez vous tourner pour utiliser la manière la plus simple que je fais toujours comme ci-dessous:

@Override
public void onCreate(Bundle savedInstanceState) {
    button1.setOnClickListener(onClickListener);
    button2.setOnClickListener(onClickListener);
    button3.setOnClickListener(onClickListener);
}

private OnClickListener onClickListener = new OnClickListener() {
    @Override
    public void onClick(final View v) {
        switch(v.getId()){
            case R.id.button1:
                 //DO something
            break;
            case R.id.button2:
                 //DO something
            break;
            case R.id.button3:
                 //DO something
            break;
        }
    }
};
20
Nguyen Minh Binh

je pense que vous devriez comparer les vues

if (v == btn_save)

à

   if (v.getId() == btn_save.getId())
8
Yashwanth Kumar
Android:onClick="CloseDialog"

de Button dans la disposition pour Dialog recherche la méthode dans Activity classe pas dans Dialog

définissez votre méthode dans Activity qui appelle Dialog ou supprimez Android:onClick="CloseDialog" à partir de la balise et définissez OnClickListener à partir de Java dans la classe Dialog.

4
Adil Soomro

Le nom du bouton fonctionne MyButton.it.

   MyButton.setOnClickListener(new OnClickListener() 
{
 @Override          
 public void onClick(View v) 
 {              
     mytextView.setText("Messi");           
  }         
});
3
Erhan Demirci

il suffit de remplacer votre code à partir de ce code

@Override
public void onClick(View v) {

    if (v == btn_save) 
        SaveSettings();
    else if (v == btn_close)
        CloseDialog();

    return;
}

à

@Override
public void onClick(View v) {

    switch(v.getId()){
            case R.id.saveBtn_settingDlg:
                SaveSettings();

            break;
            case R.id.closeBtn_settingDlg:
                CloseDialog();
            break;
        }
}
0
Ravi Makvana

ajoutez cette méthode dans la classe Java:

public void CloseDialog(View v)
{

}

car dans la mise en page, vous avez défini Android: onClick = "CloseDialog"

Essayez ceci, j'espère que c'est utile

 if(v.getId()==R.id.saveBtn_settingDlg)
       SaveSettings();

        else if (v.getId()==R.id.closeBtn_settingDlg)

            CloseDialog();
0
Kiran Babu