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
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.
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;
}
}
};
je pense que vous devriez comparer les vues
if (v == btn_save)
à
if (v.getId() == btn_save.getId())
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
.
Le nom du bouton fonctionne MyButton.it.
MyButton.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
mytextView.setText("Messi");
}
});
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;
}
}
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();