记录那些年使用 Material Design 掉过的坑(二)NavigationView中添加headerView 图片文字不显示问题

写在前面,封装虽好,可不要乱用哦。

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,以上两种方法择其一即可。最后看下效果
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值