onCreateView()没有第二次调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了onCreateView()没有第二次调用相关的知识,希望对你有一定的参考价值。

我有片段的主要活动,当我在其他活动中回到此活动时,此片段中的我的视图为空。当我进入MainActivity并调用onCreate()时,为什么不再调用onCreateView()?我想在每次回到这个活动时对片段进行一些更改,我该怎么办呢?

分段:

private View v;
private TextView info;
    public MyFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        v = inflater.inflate(R.layout.fragment_sun, container, false);


        return v;
    }
    private void setFields(){
        info= v.findViewById(R.id.infoText); //View is null here when I comeback to MainActivity
    }

    public void calculateWeather(double longitude, double latitude){
      setFields();
    //do sth

    }

主要信息

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

        Intent intent = getIntent();

        if(intent != null){
            String response = intent.getStringExtra("SETTINGS_BACK");//to detect back to this activity

            if(response != null){
                refreshView();
            }
        }

    private void setViewPager(){
    viewPager = findViewById(R.id.viewpager);
    adapter = new PagerAdapter(getSupportFragmentManager(), 2);
    adapter.addFragment(new SunFragment(), "Sun");

    tableLayout = findViewById(R.id.tabLayout);

    if(viewPager != null) {
        viewPager.setAdapter(adapter);
        Fragment f = adapter.getItem(0);
        sunFragment = (SunFragment)f;
    }
    if(tableLayout != null){
        tableLayout.setupWithViewPager(viewPager);
    }

    }

   private void refreshView(){
    if(viewPager != null) {
        sunFragment.calculateWeather(lon, lat);
   }

PagerAdapter

public class PagerAdapter extends FragmentStatePagerAdapter {

    private int fragmentNumber;
    private List<Fragment> fragmentList = new ArrayList<>();
    private List<String> fragmentsNameList = new ArrayList<>();


    public PagerAdapter(FragmentManager fm, int fragmentNumber){
        super(fm);
        this.fragmentNumber = fragmentNumber;
    }

    public void addFragment(Fragment fragment, String name){
        fragmentList.add(fragment);
        fragmentsNameList.add(name);
    }

    public SunFragment getSunFragment(){
        return (SunFragment)fragmentList.get(0);
    }

    @Override
    public Fragment getItem(int position) {
        if(position == 0){
            return SunFragment.newInstance();
        }
    }

    @Override
    public int getCount() {
        return fragmentNumber;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return fragmentsNameList.get(position);
    }
}

//编辑:添加剩余代码

答案

在以下情况下,您的片段视图将被销毁:

1)附加活动被系统或用户杀死。

2)你自己调用detach或者在它所附加的同一父视图id上调用替换新片段

3)您的片段超出了viewpager屏幕外页面限制。默认是任何一方保持活着的1个片段。超过它时,不在窗口中的碎片会被破坏。同样,只要片段落入此窗口,它们就会被创建。

由于您的案例中没有任何内容指向上述任何内容,因此系统无法再次创建视图

但是,您可以监听onResume中的更改,因为在从另一个活动返回后活动未暂停时,它肯定会被调用。

以上是关于onCreateView()没有第二次调用的主要内容,如果未能解决你的问题,请参考以下文章

Android选项卡片段不调用OnCreateView从tab2切换到tab1

替换未调用 onAttach、onCreate、onCreateView 等的活动中的片段

调用 onCreateView() 之前出现“找不到片段 id 的视图”错误

再次调用“onCreateView” - Android

popBackStack导致一次又一次调用片段的oncreateView

多次调用片段 onCreateView