OnClickListener不从Parent类触发

时间:2010-08-17 01:29:56

标签: java android android-activity

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

2 个答案:

答案 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