Проблема в том, что setContentView вашего класса Settings сбрасывает макет, который был создан вашим родительским классом onCreate ().И, следовательно, также обратные вызовы.
Чтобы обойти это, я бы предложил добавить LinearLayout с идентификатором "container" в макет 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);
}
}
Теперь, более чистый способ сделать это - заставить дочерний класс NavigationMenu предоставить что-то, что будет помещено в контейнер.
Этого можно достичь, добавив в 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);
}
}
Это имеет то преимущество, что если вы измените свой макет (например, переименуйте свой контейнер), вам придется изменить только родительский класс.