gpt4 book ai didi

java - OnClickListener 不从父类触发

转载 作者:行者123 更新时间:2023-11-29 06:20:03 25 4
gpt4 key购买 nike

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);
}
}

最佳答案

问题是您的设置类的 setContentView 将重置由您的父类的 onCreate() 创建的布局。因此,回调也是如此。

要解决这个问题,我建议您在 nav_bar 布局中添加一个 id 为“container”的 LinearLayout。

然后您保持 NavigationMenu 类不变,在您的子类中,您只需将您的 View 插入到容器中。这应该有效:

  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 添加一个抽象方法来实现这一点,该方法需要子级创建 View 。

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);
}
}

这样做的好处是,如果您更改布局(例如重命名您的容器),您只需修改父类。

关于java - OnClickListener 不从父类触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3498673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com