OnClickListener не запускается из родительского класса

1

A Следуйте этому вопросу: Группа представлений (элементов управления) на нескольких экранах

Я создал родительский класс и дочерний класс, который наследует его. Когда я устанавливаю OnClickListener в дочернем классе, событие срабатывает при нажатии кнопки. Когда я переношу набор OnClickListener в родительский класс, событие не срабатывает. Я должен упустить что-то очевидное, но я просто этого не вижу.

Спасибо, Кэмерон.

Родительский класс:

public class NavigationMenu extends Activity 
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nav_bar);

        Button loginButton = (Button) findViewById(R.id.navbtnHome);
        loginButton.setOnClickListener(new View.OnClickListener() 
        {
            public void onClick(View view) 
            {
                Toast.makeText(getApplicationContext(), "Cameron, Im here", Toast.LENGTH_SHORT).show();
                Intent i = new Intent(NavigationMenu.this, Login.class);
                startActivity(i);
            }
        });
    }
}

Класс ребенка:

public class Settings extends NavigationMenu 
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.settings);
    }
}
Теги:
android-activity

2 ответа

2
Лучший ответ

Проблема заключается в том, что setContentView вашего класса Settings будет reset макет, созданный вашим родительским классом 'onCreate(). И, следовательно, обратные вызовы также.

Чтобы обойти это, я бы предложил добавить LinearLayout с id-контейнером в макет nav_bar.

Затем вы оставите класс NavigationMenu нетронутым и в своем дочернем классе просто вставьте свое представление в контейнер. Это должно работать:

  public class Settings extends NavigationMenu 
    {
        @Override
        protected void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            LinearLayout container = (LinearLayout)findViewById(R.id.container);
            View settingsView = getLayoutInflater().inflate(R.layout.settings, null);
            container.addView(settingsView);
        }
    }

Теперь более чистым способом сделать это будет заставить ваш класс childSmartMenu предоставить что-то, что нужно положить в контейнер.

Это можно сделать, добавив абстрактный метод NavigationMenu, который потребует от детей создания представления.

public abstract class NavigationMenu extends Activity 
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nav_bar);

        Button loginButton = (Button) findViewById(R.id.navbtnHome);
        loginButton.setOnClickListener(new View.OnClickListener() 
        {
            public void onClick(View view) 
            {
                Toast.makeText(getApplicationContext(), "Cameron, Im here", Toast.LENGTH_SHORT).show();
                Intent i = new Intent(NavigationMenu.this, Login.class);
                startActivity(i);
            }
        });

        LinearLayout container = (LinearLayout)findViewById(R.id.container);
        container.addView(createView());
    }

    protected abstract View createView();
}

И в вашем дочернем классе вам просто нужно реализовать createView():

  public class Settings extends NavigationMenu 
    {
        @Override
        protected View createView()
        {
            LinearLayout container = (LinearLayout)findViewById(R.id.container);
            return getLayoutInflater().inflate(R.layout.settings, null);
        }
    }

Это имеет то преимущество, что если вы измените свой макет (например, переименуйте свой контейнер), вам придется изменить только родительский класс.

0

Вы должны вызвать super.onCreate после setContentView в своем дочернем элементе, но вам нужно работать, потому что ваш родитель вызывает setcontentview с другим представлением

  • 0
    Федж, я новичок в программировании на Java / Android. Не могли бы вы предложить какой-нибудь способ обойти меня, чтобы это сделать? По сути, я хочу разместить группу элементов управления (представлений) на нескольких экранах. Знаете ли вы о лучшем способе сделать это? Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню