在activity中找到fragment组件的问题

在activity中找到fragment组件的问题

public class MainActivity extends AppCompatActivity {
    private ViewPager fragmentContainer;
    private TabLayout tabs ;
    private Fragment_main fragment_main;
    private Fragment_shop fragment_shop;
    private Fragment_me fragment_me;
    private Fragment_CitySelect fragment_citySelect;
    Button btn_CitySelect;

    @Override
    protected void onStart() {
        super.onStart();
        //初始化fragment_main中的组件
        initFragmentView();

    }

    private void initFragmentView() {
        //城市选择按钮

        View view = this.fragment_main.getView();
        btn_CitySelect = view.findViewById(R.id.btn_selecCity);
        btn_CitySelect.setOnClickListener(new Fragment_main_listener());
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
        initView();
        setOnListener();

    }

    private void setOnListener() {

        fragmentContainer.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabs));
        tabs.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(fragmentContainer));
        //main_fragment中的组件


    }

    private void initView() {

        fragmentContainer = findViewById(R.id.container);
        tabs = findViewById(R.id.tabs);
        fragment_me = Fragment_me.newInstance();
        fragment_main = Fragment_main.newInstance();
        fragment_shop = Fragment_shop.newInstance();


        final Fragment[] fragmentsList = new Fragment[]{fragment_main,fragment_shop,fragment_me};
        fragmentContainer.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int i) {
                return fragmentsList[i];
            }

            @Override
            public int getCount() {
                return fragmentsList.length;
            }
        });

    }


    private class Fragment_main_listener implements View.OnClickListener{

        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.btn_selecCity:
                    fragment_main.getFragmentManager().beginTransaction().hide(fragment_main);
                    fragment_main.getChildFragmentManager().beginTransaction()
                            .add(R.id.main_fragment_main_menu, fragment_citySelect).commit();

            }
        }
    }


}

initFragmentView()函数中,fragment_main.findViewById()一直返回空值. 谢谢老师!

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕雪 2019-06-13 10:53:14

fragment_main中有这个控件吗?或者你去fragment_main中添加一个方法,从这个方法中传到MainActivity中试试

  • 提问者 爱笑的syt #1
    都不行,我又试了试,发现了以下问题:fragment与activity的加载顺序是:act onCreate()--> fragment.onCreateView() --> activity.onStart(),但是我在OnStart()和onCreateView()上设置断点,发现居然是先执行的onStart(),所以导致onStart函数中的初始化为null,因为fragment还没有加载view。为什么会出现这种颠倒执行的现象?
    2019-06-13 12:57:29
  • 好帮手慕雪 回复 提问者 爱笑的syt #2
    原则就是自己的页面管理自己的控件,不要相互牵扯。并且当前的页面,有显示对应的fragment时,那你能获得它里面的控件,出来就不能显示了
    2019-06-13 14:35:18
提问者 爱笑的syt 2019-06-12 22:22:57

前提:activity结构为ViewPager+tablayout+3*fragment,现在无法再activity中找到fragment中的相应组件

第21行,View view = this.fragment_main.getView();这句话的view一直是空指针

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师