Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于Activity中Fragment空指针的问题 #71

Closed
lvyandev opened this issue Jan 24, 2018 · 7 comments
Closed

关于Activity中Fragment空指针的问题 #71

lvyandev opened this issue Jan 24, 2018 · 7 comments

Comments

@lvyandev
Copy link

使用版本:1.3.5

ml8dy js 5jy f40zdo rav

ViewPager用来切换两个Fragment
这两个Fragment的数据由于来自于一个接口,所以我在外层的Activity中进行网络请求
LoadService也是放在Actvity中监听的
请求完数据以后通过Fragment中的一个方法将值传入更新界面。
但是我发现用了LoadService以后,Fragment中的控件报空指针异常,getActivity和getContext方法也都为null。
这种情况应该如何解决呢?

@KingJA
Copy link
Owner

KingJA commented Jan 25, 2018

@a512509050 你好,最好提供完整Demo的代码,有空我帮你看看。

@lvyandev
Copy link
Author

您好,已经发送到gmail邮箱了,请查收一下附件

@lvyandev
Copy link
Author

@KingJA 大佬,请问demo收到了吗,有没有观察出啥问题呀

@KingJA
Copy link
Owner

KingJA commented Jan 29, 2018

@a512509050 你好,你初始化FragmentPagerAdapter的时候mFragmetns是null,建议将mFragmetns通过构造函数传入。

@KingJA KingJA closed this as completed Jan 29, 2018
@lvyandev
Copy link
Author

@KingJA
大佬,我试了,还是null呀

private List<Fragment> mFragments = new ArrayList<>();

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        mLoadService = LoadSir.getDefault().register(this, new Callback.OnReloadListener() {
            @Override
            public void onReload(View v) {
                mLoadService.showSuccess();
            }
        });

        initFragments(savedInstanceState);

        QMUITabSegment.Tab orderDetail = new QMUITabSegment.Tab("FragmentA");
        QMUITabSegment.Tab orderProgress = new QMUITabSegment.Tab("FragmentB");

        mViewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager(), mFragments));

        mTab.addTab(orderDetail)
                .addTab(orderProgress)
                .setupWithViewPager(mViewPager, false);

        mTab.setOnTabClickListener(new QMUITabSegment.OnTabClickListener() {
            @Override
            public void onTabClick(int index) {
                mCurrentPos = index;
            }
        });

        new Handler()
                .postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mLoadService.showSuccess();
                        mFragmentA.setData("这是A刷新完的数据");
                        mFragmentB.setData("这是B刷新完的数据");
                    }
                }, 1000);
    }

    private void initFragments(Bundle savedInstanceState) {
        if (savedInstanceState == null) {
            mFragmentA = FragmentA.newInstance();
            mFragmentB = FragmentB.newInstance();
        } else {
            mCurrentPos = savedInstanceState.getInt(FRAGMENT_REPLACE);
            FragmentManager fm = getSupportFragmentManager();
            mFragmentA = (FragmentA) FragmentUtils.findFragment(fm, FragmentA.class);
            mFragmentB = (FragmentB) FragmentUtils.findFragment(fm, FragmentB.class);
        }

        if (mFragments.size() == 0) {
            mFragments.add(mFragmentA);
            mFragments.add(mFragmentB);
        }

        mTab.selectTab(mCurrentPos);
    }
public class MyPagerAdapter extends FragmentPagerAdapter {
    private List<Fragment> mFragments;

    public MyPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
        super(fm);
        this.mFragments = fragments;
    }

    @Override
    public Fragment getItem(int position) {
        return mFragments.get(position);
    }

    @Override
    public int getCount() {
        return mFragments.size();
    }
}

@KingJA
Copy link
Owner

KingJA commented Jan 30, 2018

@a512509050
LoadingCallback重写如下方法

@Override
    public boolean getSuccessVisible() {
        return true;
    }

这样,原布局在不显示的时候也会被加载到视图中,就不会报错。
关于Fragment+ViewPager的使用建议参考Demo中的案例。

@lvyandev
Copy link
Author

lvyandev commented Jan 31, 2018

好的,多谢大佬浪费时间帮忙
另外我还发现另一种解决方案,将Fragment作如下改动

public class FragmentA extends Fragment {
    @BindView(R.id.tv)
    TextView mTv;
    Unbinder unbinder;
    private boolean isCreated;
    private boolean hasData;
    private String data;

    public static FragmentA newInstance() {
        return new FragmentA();
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_a, container, false);
        unbinder = ButterKnife.bind(this, view);
        isCreated = true;
        if (hasData) {
            mTv.setText(data);
        }
        return view;
    }

    public void setData(Object data) {
        if (data instanceof String) {
            //save data , wait fragment created and set data
            if (isCreated) {
                mTv.setText((CharSequence) data);
            } else {
                hasData = true;
                this.data = (String) data;
            }

        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }
}

除此之外,请问LoadSir有代码调用onReloadListener而不通过手点的方法吗,这样在某些情况下就可以通过发消息的形式来通知界面切换状态了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants