写在前面,封装虽好,可不要乱用哦。
Navigation 中haderView 在继承类中headerView 内容不显示,掉坑指数(1颗星)
Android 实际开发中,经常为了更好的扩展和减少代码的重写,会把一些公共方法进行封装,例如,经常我们会封装一个BaseActivity,以便于复用。可是复用虽好,可不要乱用哦。这不楼主最近就遇到一个蛋疼的问题
在使用DrawLayout + NavigationView 实现Material Design 效果中就遇到一个蛋疼的问题,就是NavigationView 中添加了一个headerView ,
headerView 里面用户登录成功后不显示成功后的sharePreference 中存放的用户图像,昵称等信息。当时楼主以为自己写法问题,各种debug,网上各种查找,来回折腾了一下午,可问题就是没解决,依然不显示。急的楼主都开始怀疑人生了。明明没有报错,明明获取到了对象,就是不显示加载内容。
后来看到了这位老兄的一篇文章NavigationView获取Header View的问题 于是乎我把通过extends BaseActivity 中initView()方法initNavigationView() 放到了onCreate()方法中,于是神奇的一幕出现了,它竟然加载成功了。what ’ a fuck . 这是什么鬼,内心一万头马在狂奔。回过头来,我发现自己的在继承BaseActivity的时候,重写了onCreate()方法,并且重新setContentView(),再调用initNavigationView()方法。这样在程序初始化的过程中,Dawer其实是没有打开的,所以布局没有初始化,自然也不能找到其中的控件。 解决办法就有两种
1.在继承并重新的onCreate()方法中进行navigation中headerView初始化工作
2.直接在继承BaseActivity的initView()方法中调用,不要重写onCreate()方法,不要setContentView()具体如下:
package cn.atom.mvpproject.base.baseView;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import cn.atom.mvpproject.base.basePresenter.BasePresenter;
/**
* 所有Activity类基类
* 使用泛型目的关联Activity与该Activity对应的Present
* Created by atom on 2017/10/20.
*/
public abstract class BaseActivity<V , T extends BasePresenter<BaseView>> extends AppCompatActivity {
// 定义泛型对象,因该泛型继承与BasePresenter,因此可以通过向下转型获取具体presenter
protected T basePresenter;
private Unbinder unbinder;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 加载视图前准备工作
doPrepareBeforeSetView();
// 初始化视图
setContentView(getLayoutId());
// 添加注解
unbinder = ButterKnife.bind(this);
// 初始化视图
initView();
// 初始化Present
basePresenter = initPresent();
// 加入view
if (null != basePresenter) {
basePresenter.attachView((BaseView) this);
}
}
protected abstract void initView();
private void doPrepareBeforeSetView() {
}
protected abstract T initPresent();
protected abstract int getLayoutId();
/**
* 不带参数的Activity跳转
*
* @param targetActivityClass
*/
public void openActivity(Class<?> targetActivityClass) {
openActivity(targetActivityClass, null);
}
/**
* 带参数的Activity跳转
*
* @param targetActivityClass
* @param bundle
*/
public void openActivity(Class<?> targetActivityClass, Bundle bundle) {
Intent it = new Intent(this, targetActivityClass);
if (null != bundle) {
it.putExtras(bundle);
}
startActivity(it);
}
/**
* 不带参数的Activity跳转并关闭当前页
*
* @param targetActivityClass
*/
public void openActivityAndCloseThis(Class<?> targetActivityClass) {
openActivityAndCloseThis(targetActivityClass, null);
this.finish();
}
/**
* 带参数的Activity跳转并关闭当前页
*
* @param targetActivityClass
* @param bundle
*/
public void openActivityAndCloseThis(Class<?> targetActivityClass, Bundle bundle) {
openActivity(targetActivityClass, bundle);
this.finish();
}
/**
* 不含参数,带返回结果Activity 跳转
*
* @param targetActivityClass
* @param requestCode
*/
public void openActivityForResult(Class<?> targetActivityClass, int requestCode) {
openActivityForResult(targetActivityClass, null, requestCode);
}
/**
* 含有参数,带返回结果的Activity 跳转
*
* @param targetActivityClass
* @param bundle
* @param requestCode
*/
public void openActivityForResult(Class<?> targetActivityClass, Bundle bundle, int requestCode) {
Intent it = new Intent(this, targetActivityClass);
if (null != bundle) {
it.putExtras(bundle);
}
startActivityForResult(it, requestCode);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (null != unbinder) {
// 解绑注解
unbinder.unbind();
}
// 退出activity解除绑定
if (null != basePresenter) {
basePresenter.detachView();
}
}
}
以上是楼主封装的BaseActivity ,其中
红线标注的表示BaseActivity 封装。
楼主开始的处理
楼主运行蛋疼的效果
解决方案
方案一:
去掉重写onCreate()方法中的setContentView(getLayoutId())方法。直接把初始化工作initNavigationView() 放入onCreate()方法中 如图
方案二:
不需要重写onCreate()方法,直接在重写基类(BaseActivity)的initView()方法中调用即可。如图
ok,以上两种方法择其一即可。最后看下效果