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, так как он обязательно будет вызван, когда действие будет приостановлено после возвращения из другого действия.