[英]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.