OnClickListener не запускается из родительского класса - PullRequest
1 голос
/ 17 августа 2010

A Ответьте на этот вопрос: Группа видов (элементов управления) на нескольких экранах

Я создал родительский класс и дочерний класс, который наследуется от него. Когда я устанавливаю OnClickListener в дочернем классе, событие срабатывает при нажатии кнопки. Когда я перемещаю set 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 ]

3 голосов
/ 24 августа 2010

Проблема в том, что 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);
        }
    }

Это имеет то преимущество, что если вы измените свой макет (например, переименуйте свой контейнер), вам придется изменить только родительский класс.

0 голосов
/ 17 августа 2010

Вы должны вызывать super.onCreate после setContentView у вашего ребенка, но вы должны обойти это, потому что ваш родитель вызывает setcontentview с другим представлением

...