AfterYoung 2021-04-01 16:22 采纳率: 81.8%
浏览 140
已采纳

求安卓大手子救救孩子吧,这个app项目闪退问题怎么解决?

附上两个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();
    }
  • 写回答

3条回答 默认 最新

  • knight康康 2021-04-02 09:44
    关注

    代码调用顺序问题,导致指针的,因为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();
        }

     

    总结:父类子类代码执行的顺序要搞清楚,搞清楚父类写那些抽象方法的意义。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!