Как я могу инициализировать свой RelativeLayoutButton вне метода onCreate?

#java #android #android-layout

#java #Android #android-макет

Вопрос:

Я создаю целевую страницу с рядом кнопок для других действий. LandingActivity расширяет пользовательскую базовую активность. Кнопки имеют свой собственный RelativeLayout с изображением и некоторым текстом с LandingButton классом для их обработки. Прямо сейчас все работает, пока мои кнопки объявлены и настроены в onCreate.Я хотел бы немного больше разделить.

Я пытался объявлять их перед onCreate, инициализируя их внутри моего метода initViews() и вызывая его внутри onCreate, как я бы делал с любым стандартным представлением.

 public class LandingActivity extends BaseActivity {

    LandingButton bMyData = new LandingButton(this, R.id.myDataButton);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_layout)
    //initViews();
 

Это приводит к исключению NullPointerException, указывающему мне на LandingButton.java

 public LandingButton(Context context, int id)
{
    super(context);

    if (!(context instanceof Activity))
        return;
 

Я также попытался изменить свой LandingButton на ссылку на BaseActivity вместо Activity:

     if (!(context instanceof BaseActivity))
        return;
 

Та же ошибка. Приложение вылетает во время отладки, как только оно попадает в onCreate, не давая мне возможности продолжить.

В идеале я хотел бы объявить свои LandingButtons перед onCreate и отредактировать их в initViews(), чтобы мой метод onCreate был аккуратным, если это возможно.

Ответ №1:

Вы не можете инициализировать свои представления раньше onCreate , потому что именно с этого начинается ваша активность.

Вы не можете инициализировать что-либо в своем классе activity до того, как вы уже инициализировали activity.

Поэтому, если вы хотите извлечь свои инициализации в метод, просто вызовите этот метод внутри onCreate :

 public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    setContentView(R.layout.layout); 
    initViews();
}
 

Из документации :

Вызывается при запуске действия. Именно здесь должна проходить большая часть инициализации: вызов setContentView(int) для расширения пользовательского интерфейса activity, использование findViewById(int) для программного взаимодействия с виджетами в пользовательском интерфейсе

Комментарии:

1. Я все это понимаю и заявил после первого абзаца, что я уже пробовал это.

2. Я просто хотел сказать, что вы не можете инициализировать свои представления раньше onCreate , это также то, что я понимаю из вашего вопроса, который вы задаете

3. Ах, гоча. Я обновил свой вопрос, чтобы отразить правильное onCreate.