Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在基本活动类中初始化公共视图_Java_Android_Inheritance_Android Activity_Polymorphism - Fatal编程技术网

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);
    }