Android: событие нажатия кнопки
У меня есть 2 кнопки в моем XML файле с RelativeLayout. В моем классе я расширил Dialog и выполнил OnClickListener, а также добавил метод OnClick (View v). Но почему-то код onClick никогда не выполняется при нажатии кнопки. Может ли кто-нибудь помочь мне найти проблему с моим кодом:
<?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" />
Класс
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();
}
В xml для close btn я попробовал CloseBtnClicked также, но никакой разницы, и я получаю сообщение UnexpectedError и приложение отключается. Так или иначе событие не активируется никоим образом. А также при добавлении onClick к closebtn кнопка теперь отображается в верхнем левом углу экрана и потеряла фактическое местоположение.
Вызов SettingDialog из класса 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();
}
Может кто-нибудь помочь мне узнать причину этой проблемы и как ее решить. Я новичок в Android.
Спасибо
Ответы
Ответ 1
Решение моей проблемы:
Вместо использования AlertBuilder и AlertDialog я просто вызвал диалог как:
SettingDialog sd = new SettingDialog(this, mySettings);
sd.show();
И это сработало хорошо. Все события кликов обрабатывались только в SetDialog. В SettingDialog изменений не было. В действии изменяется только способ вызова параметра SettingDialog. Что это.
BTW, In onClick(), сопоставляющий вид с его именем:
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;
}
Также отлично работает. Я использую только этот способ, и он работает хорошо. Нет необходимости проверять только идентификатор.
Надеюсь, мое решение поможет другим, которые застряли, как я.
Спасибо всем за ваши усилия и помощь.
Ответ 2
Вам следует обратиться к самому простейшему способу, который я всегда делаю, как показано ниже:
@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;
}
}
};
Ответ 3
Я думаю, вам следует сравнить идентификатор вида без представлений
if (v == btn_save)
к
if (v.getId() == btn_save.getId())
Ответ 4
android:onClick="CloseDialog"
of Button
в макете для Dialog
выполняет поиск метода в классе Activity
не в Dialog
определите свой метод в Activity
, который вызывает Dialog
или
удалите android:onClick="CloseDialog"
из тега и установите OnClickListener
из кода Java в классе Dialog
.
Ответ 5
Название кнопки - MyButton.it.
MyButton.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
mytextView.setText("Messi");
}
});
Ответ 6
добавьте этот метод в класс java:
public void CloseDialog(View v)
{
}
потому что в макете вы установили android: onClick = "CloseDialog"
Ответ 7
Попробуйте это, я надеюсь, что это поможет
if(v.getId()==R.id.saveBtn_settingDlg)
SaveSettings();
else if (v.getId()==R.id.closeBtn_settingDlg)
CloseDialog();
Ответ 8
Просто замените свой код Из этого кода
@Override
public void onClick(View v) {
if (v == btn_save)
SaveSettings();
else if (v == btn_close)
CloseDialog();
return;
}
to
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.saveBtn_settingDlg:
SaveSettings();
break;
case R.id.closeBtn_settingDlg:
CloseDialog();
break;
}
}