"Заголовок" Представления и кнопки: как подключить слушателей к кнопкам в "заголовке", который не имеет собственного действия?
Я затронул этот вопрос здесь, где Кристофер дал на него ответ, но я не совсем понимаю его, поэтому я подумал, что пришло время сделать его реальным вопросом, а не просто "продолжением" =)
В настоящее время приложение, которое я пишу, имеет 4 разных экрана:
- Экран 1 - список узлов (основной экран)
- Экран 2 - меню настроек, таблица раскладок с кнопками
- Экран 3 - навигация
- Экран 4 - текстовая информация о версии и т.д.
Эти экраны можно перемещать в/из окна "Заголовок", расположенного сверху. Заголовок тогда имеет 4 разные кнопки:
+--------------------+
| menu with buttons |
+--------------------+
| |
| |
| |
| C O N T E N T |
| |
| |
| |
+--------------------+
Заголовок - это просто XML файл (header.xml) с несколькими кнопками. Этот header.xml включается в макеты, используя разметку включения. Например, main.xml имеет строку:
<include layout="@layout/header"></include>
С заголовком все в порядке, но вопрос в том, как правильно прикрепить OnClickListeners для кнопок в заголовке?
Кристофер указал, что вы можете создать класс Activity и выполнять там хуки, например:
public class BaseActivity extends Activity {
protected View.OnClickListener mButtonListener;
protected void setupHeaderButtons() {
findViewById(R.id.header_btn_1).setOnClickListener(mButtonListener);
// ...
findViewById(R.id.header_btn_n).setOnClickListener(mButtonListener);
}
}
public class FirstActivity extends BaseActivity {
@Override
public void onCreate(Bundle b) {
super.onCreate(b);
setContentView(R.layout.first_activity);
// This needs to be done *after* the View has been inflated
setupHeaderButtons();
}
}
Во-первых, я не могу заставить его работать, так как метод setupHeaderButtons
не доступен из FirstActivity. Во-вторых, это правильный путь?
Ответы
Ответ 1
Метод setupHeaderButtons()
имеет значение protected
, поэтому к нему могут обращаться только классы, которые extend
имеют базовый класс, который в этом случае BaseActivity
.
Вы уверены, что ваш FirstActivity
расширяет BaseActivity
?
Ответ 2
Я бы предпочел это, поэтому вам не нужно помнить (и, вероятно, забыть), для вызова setupHeaderButtons для каждой производной активности. BTW, установите U pHeaderButtons это лучшее имя.
public class BaseActivity extends Activity {
protected View.OnClickListener mButtonListener;
@Override
public void setContentView(int layoutResID) {
super.setContentView(layoutResID);
setupHeaderButtons();
}
protected void setupHeaderButtons() {
findViewById(R.id.header_btn_1).setOnClickListener(mButtonListener);
// ...
findViewById(R.id.header_btn_n).setOnClickListener(mButtonListener);
}
}
public class FirstActivity extends BaseActivity {
@Override
public void onCreate(Bundle b) {
super.onCreate(b);
setContentView(R.layout.first_activity);
}
}
Ответ 3
Я лично не думаю, что вы должны перегружать вещи. Необходимо вызвать setupHeaderButtons, должно быть хорошо, особенно если у вас есть только несколько действий.
Если вы используете стандартные режимы запуска, активность будет перезапущена. Ознакомьтесь с Основами приложений, если вы заинтересованы в ознакомлении с режимами запуска.