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);
}
}
Проблема заключается в том, что 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);
}
}
Это имеет то преимущество, что если вы измените свой макет (например, переименуйте свой контейнер), вам придется изменить только родительский класс.
Вы должны вызвать super.onCreate после setContentView в своем дочернем элементе, но вам нужно работать, потому что ваш родитель вызывает setcontentview с другим представлением