我有一个家长活动NavigationActivity
,它执行以下操作:
public class NavigationActivity extends Activity {
protected LinearLayout navigationBar;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
navigationBar = findViewById(R.id.navbar);
}
}
它有一种设置
navigationBar
可见性的方法:@Override
protected void setNavbarVisibility(int view) {
if (this.navigationBar != null) {
this.navigationBar.setVisibility(view);
}
}
我有一个扩展
AdventureActivity
的活动NavigationActivity
:public class AdventureActivity extends NavigationActivity {
EditText title;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstancState);
renderAdventureLayout();
}
public void renderAdventureLayout() {
Handler h = new Handler();
title.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(final View v, boolean hasFocus) {
if (hasFocus) {
h.postDelayed(new Runnable() {
@Override
public void run() {
setNavbarVisibility(View.GONE);
}
}, 200);
} else {
h.postDelayed(new Runnable() {
@Override
public void run() {
setNavbarVisibility(View.VISIBLE);
}
}, 200);
}
}
}
}
}
现在,我不必在
navigationBar
中声明或初始化AdventureActivity
,并且它最初已经可见。但是,语句setNavbarVisibility(View.GONE);
在AdventureActivity
中似乎不起作用,除非我也将navigationBar
初始化为NavigationActivity
初始化,因为根据调试器,navigationBar
在未在。我发现在两个活动中都必须初始化AdventureActivity
是多余的。 最佳答案
您在两个活动中均未提供内容视图,该视图导致findViewById()
方法返回null
。
如果要创建这样的活动层次结构,则意味着NavigationActivity
应该具有抽象方法,子类应该实现: public abstract class NavigationActivity extends Activity { ... @LayoutRes protected abstract int getLayoutId(); }
然后AdventureActivity
将变为: public class AdventureActivity extends NavigationActivity { ... @Override @LayoutRes protected int getLayoutId() { return R.layout.some_activity; } }
现在在NavigationActivity#onCreate()
中: @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getLayoutId()); navigationBar = findViewById(R.id.navbar); }
这要求每个子类提供一个布局,其中存在一个ID为LinearLayout
的navbar
,否则您的navigationBar
最终将成为null
。