我有一个家长活动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为LinearLayoutnavbar,否则您的navigationBar最终将成为null

10-04 10:00