附上两个Activiy的部分代码
public class MainActivity extends BaseActivity implements TabLayout.OnTabSelectedListener, IMutualListener {
private ViewPager mViewPager ;
private TabLayout mTabLayout ;
private View tabView = null;
private List<String> mTabList = new ArrayList<>();
private MainFragmentAdapter mFragmentAdapter;
private List<Fragment> mFragments = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = findViewById(R.id.home_ViewPager);
mTabLayout = findViewById(R.id.tab_layout);
}
private int[] tabIcons = {
R.mipmap.selector_home_normal,
R.mipmap.selector_alarm_normal,
R.mipmap.selector_mine_normal,
R.mipmap.selector_more_normal,
};
private int[] tabIconsPressed = {
R.mipmap.selector_home_pressed,
R.mipmap.selector_alarm_pressed,
R.mipmap.selector_mine_pressed,
R.mipmap.selector_more_pressed,
};
@Override
public int getContentViewId(){
return R.layout.activity_main;
}
@Override
public void initViews() {
receiveAdDownload();
initFragmentList();
initFragments();
initLabeView();
}
private void initLabeView() {
initBadgeViews();
}
private void initBadgeViews() {
}
private void initTabList(){
mTabList.clear();
mTabList.add(MyApplication.getAppResources().getString(R.string.home));
mTabList.add(MyApplication.getAppResources().getString(R.string.alarm));
mTabList.add(MyApplication.getAppResources().getString(R.string.mine));
mTabList.add(MyApplication.getAppResources().getString(R.string.more));
}
private void initFragmentList(){
mFragments.clear();
mFragments.add(HomeFragment.getInstance(MyApplication.getAppResources().getString(R.string.home)));
mFragments.add(AlarmFragment.getInstance(MyApplication.getAppResources().getString(R.string.alarm)));
mFragments.add(MineFragment.getInstance(MyApplication.getAppResources().getString(R.string.mine)));
mFragments.add(MineFragment.getInstance(MyApplication.getAppResources().getString(R.string.more)));
}
private void initFragments() {
initTabList();
mFragmentAdapter = new MainFragmentAdapter(getSupportFragmentManager(), mTabList, getApplicationContext(), mFragments);
mViewPager.setAdapter(mFragmentAdapter);
mViewPager.setCurrentItem(0);
mTabLayout.setupWithViewPager(mViewPager);
mTabLayout.setTabMode(TabLayout.MODE_FIXED);
mTabLayout.addOnTabSelectedListener(this);
mTabLayout.getTabAt(0).setCustomView(getTabView(0));
mTabLayout.getTabAt(1).setCustomView(getTabView(1));
mTabLayout.getTabAt(2).setCustomView(getTabView(2));
mTabLayout.getTabAt(3).setCustomView(getTabView(3));
}
public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements UIInitA {
protected P mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (null != onCreatePresenter()){
mPresenter =onCreatePresenter();
}
AppManager.newInstance().addActivivty(this);
setContentView(getContentViewId());
initViews();
addListener();
initData();
}
代码调用顺序问题,导致指针的,因为initViews() 方法先走,initViews 走之前mViewPager = findViewById(R.id.home_ViewPager);这行代码还没执行,这就导致mViewPager还没初始化,你使用他就空指针了。
分析:
你不应该在子类调用onCreate 方法
你BaseActivity 的onCreate 是这样写的
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (null != onCreatePresenter()){
mPresenter =onCreatePresenter();
}
AppManager.newInstance().addActivivty(this);
setContentView(getContentViewId());
initViews();
addListener();
initData();
}
然后你又在MainActiviy 又从新写了onCreate方法
@Override
protected void onCreate(Bundle savedInstanceState) {
//!!!重点这句话!!!
//这句话是不是相当于吧BaseActivity的Oncreate方法,
//所以initViews 方法先执行了,
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//initViews 都走完了,mViewPager才被赋值的
mViewPager = findViewById(R.id.home_ViewPager);
mTabLayout = findViewById(R.id.tab_layout);
}
你看你在子类onCreate方法里面调用super.onCreate 方法,是不是父类的onCreate写执行了,父类的onCreate执行,是不是initViews 就执行了
解决方案:
子类不要重写onCreate方法了,onCreate方法删掉,直接吧findviewId放在initViews里面就行
@Override
public void initViews() {
mViewPager = findViewById(R.id.home_ViewPager);
mTabLayout = findViewById(R.id.tab_layout);
receiveAdDownload();
initFragmentList();
initFragments();
initLabeView();
}
总结:父类子类代码执行的顺序要搞清楚,搞清楚父类写那些抽象方法的意义。
判断所有可能出现空指针的地方
mainactivity 112行 adapter null