簡體   English   中英

無法從父類觸發OnClickListener

[英]OnClickListener not firing from Parent class

答:這個問題的跟進: 在多個屏幕上的視圖組(控件)

我創建了一個父類和一個從其繼承的子類。 當我在子類中設置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);
    }
}

問題在於,您的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);
        }
    }

這樣做的好處是,如果您更改布局(例如重命名容器),則只需修改父類。

您應該在孩子的setContentView之后調用super.onCreate,但是您必須變通,因為您的父級使用另一個視圖調用setcontentview

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM