Java 在基本活动类中初始化公共视图
我有一个父活动Java 在基本活动类中初始化公共视图,java,android,inheritance,android-activity,polymorphism,Java,Android,Inheritance,Android Activity,Polymorphism,我有一个父活动NavigationActivity,它的功能如下: public class NavigationActivity extends Activity { protected LinearLayout navigationBar; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState
NavigationActivity
,它的功能如下:
public class NavigationActivity extends Activity {
protected LinearLayout navigationBar;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
navigationBar = findViewById(R.id.navbar);
}
}
它有一个设置导航栏可见性的方法:
@Override
protected void setNavbarVisibility(int view) {
if (this.navigationBar != null) {
this.navigationBar.setVisibility(view);
}
}
我有一个扩展导航活动的活动AdventureActivity
:
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);
}
}
}
}
}
现在,我不必在AdventureActivity
中声明或初始化navigationBar
,它最初已经可见。但是,语句setNavbarVisibility(View.GONE)
在AdventureActivity
中似乎不起作用,除非我也在navigationBar
中初始化它,因为根据调试器,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;
}
}
现在在导航活动#onCreate()
中:
这要求每个子类提供一个布局,其中存在一个id为navbar
的LinearLayout
,否则您的navigationBar
将最终成为null
您在AdventureActivity中在哪里调用setNavbarVisibility方法?我在EditText setOnFocusChangeListener中调用它,并且监听器正在一个public void方法中被调用。你能添加focuschangesetener的代码吗?@AbdulWaheed,请查看我的编辑查看下面的答案
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutId());
navigationBar = findViewById(R.id.navbar);
}