A跟进此问题:Group of Views (controls) on multiple screens
我创建了一个父类和一个继承它的子类。当我在子类中设置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);
}
}
答案 0 :(得分:3)
问题是您的Settings类的setContentView将重置由您的父类'onCreate()创建的布局。因此,回调也是如此。
要解决此问题,我建议您在nav_bar布局中添加ID为“container”的LinearLayout。
然后保持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);
}
}
这样做的好处是,如果您更改布局(例如重命名容器),则必须仅修改父类。
答案 1 :(得分:0)
你应该在孩子的setContentView之后调用super.onCreate,但是你必须解决这个问题,因为你的父母用另一个视图调用setcontentview