onCreateView() не вызывается во второй раз

У меня есть mainacctivity с фрагментом, и мой View в этом фрагменте равен нулю, когда я возвращаюсь к этому действию после того, как занялся другим действием Почему onCreateView() не вызывается снова, когда я вхожу в MainActivity и вызывается onCreate()? Я хочу вносить некоторые изменения во фрагмент каждый раз, когда возвращаюсь к этому занятию, как я могу это сделать?

Фрагмент:

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 ответ

Решение

Вид вашего фрагмента будет уничтожен в следующих случаях:

1) активность привязана к тому, чтобы быть убитым системой или пользователем.

2) вы сами вызываете на нем detach или вызываете замену для нового фрагмента с тем же идентификатором родительского представления, к которому он прикреплен

3) ваш фрагмент выходит за пределы экранной страницы viewpager. По умолчанию 1 фрагмент с обеих сторон остается в живых. Когда это выходит за рамки этого, фрагменты не в окне разрушаются. Точно так же, как только фрагмент попадет в это окно, они будут созданы.

Поскольку в вашем случае ничто не указывает на что-либо из вышеперечисленного, для системы не имеет смысла снова создавать представление

Тем не менее, вы можете прослушать изменения в onResume, так как он обязательно будет вызван, когда действие будет приостановлено после возвращения из другого действия.

Другие вопросы по тегам