Раздутый макет из viewpager является нулевым после созданного представления

Когда я добавляю фрагмент окна просмотра, все идет хорошо, но когда я перехожу в другое приложение и возвращаюсь к своему приложению, у меня возникает странная проблема, что getView или inflated имеет значение null. Он показывает вид, но я не могу получить к нему доступ.

Вот фрагмент, который будет использоваться в ViewPager:

public class FragmentRestauranteBandejao extends Fragment {

JSONObject dados;
View inflated;
ExpandableListView cardapio;
List<String> refeicoes;
List<String> pratos_almoco;
List<String> pratos_janta;
Map<String, List<String>> bandejao = null;
ExpandableListAdapter adapter;

public static FragmentRestauranteBandejao newInstance(String restaurante){
    FragmentRestauranteBandejao frag = new FragmentRestauranteBandejao();

    Bundle args = new Bundle();
    args.putString("restaurante", restaurante);
    frag.setArguments(args);
    return frag; 
}

public void getDados(){
    if(dados == null){
        if(USPRestaurantes.getDados()){
            dados = USPRestaurantes.getCardapioByRestaurante(getArguments().getString("restaurante"));
        }else{
            Log.d("debug", "Dados ainda não estão prontos");
            return;
        }   
    }

    if(inflated == null){
        Log.d("debug", "inflated eh null");
        if(inflated == null){
            return;
        }
    }
    //... some code here that deals with the data that comes from a request made at USPRestaurantes.
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    inflated = inflater.inflate(R.layout.fragment_cardapio, container, false);

    return inflated;
}


@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    inflated = view;
    prepararCardapio();
    getDados();
}

public void prepararCardapio(){

    cardapio = (ExpandableListView) getView().findViewById(R.id.cardapio);
    cardapio.setClickable(true);

    refeicoes = new ArrayList<String>(Arrays.asList("Almoço","Jantar"));
    pratos_almoco = new ArrayList<String>();
    pratos_janta = new ArrayList<String>();
    pratos_almoco.add("");
    pratos_janta.add("");

    bandejao = new LinkedHashMap<String, List<String>>();

    bandejao.put(refeicoes.get(0), pratos_almoco);
    bandejao.put(refeicoes.get(1), pratos_janta);

    adapter = new ExpandableListViewAdapter(getActivity(), refeicoes, bandejao);
    cardapio.setAdapter(adapter);
}

Фрагмент ViewPager:

public class FragmentBandejoes extends Fragment{

private String[] tabs = {"Central", "Química", "Física"};

private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ArrayList<Fragment> paginasBandeco;
public int dia_semana = 0;
ProgressDialog dialog;

private TabPageIndicator mIndicator;
int number = 0;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    paginasBandeco = new ArrayList<Fragment>();
    paginasBandeco.add(FragmentRestauranteBandejao.newInstance("central"));
    paginasBandeco.add(FragmentRestauranteBandejao.newInstance("quimica"));
    paginasBandeco.add(FragmentRestauranteBandejao.newInstance("fisica"));

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View inflated = inflater.inflate(R.layout.fragment_bandejoes, container, false);
    return inflated;    
}

public void notifyFragments(){

    for(int i=0; i<3; i++){     
        ((FragmentRestauranteBandejao) mAdapter.getItem(i)).getDados();
    }

    if(dialog != null){
        dialog.dismiss();
    }

}

public void getCardapios(boolean update){
    if(!USPRestaurantes.getDados() || update){

        boolean request_made = USPRestaurantes.getCardapio(getActivity());
    }
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {

    getCardapios(false);

    viewPager = (ViewPager) getView().findViewById(R.id.pager_bandejoes);

    mAdapter = new TabsPagerAdapter(((MainActivity) getActivity()).fragmentManager, paginasBandeco, tabs);

    viewPager.setAdapter(mAdapter);
    mIndicator = (TabPageIndicator) getActivity().findViewById(R.id.indicator);
    mIndicator.setViewPager(viewPager);

    mIndicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            mIndicator.setCurrentItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {                
        }
    });     
}

И, наконец, FragmentStatePagerAdapter:

public class FragmentBandejoes extends Fragment{

private String[] tabs = {"Central", "Química", "Física"};

private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ArrayList<Fragment> paginasBandeco;
public int dia_semana = 0;
ProgressDialog dialog;

private TabPageIndicator mIndicator;
int number = 0;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    paginasBandeco = new ArrayList<Fragment>();
    paginasBandeco.add(FragmentRestauranteBandejao.newInstance("central"));
    paginasBandeco.add(FragmentRestauranteBandejao.newInstance("quimica"));
    paginasBandeco.add(FragmentRestauranteBandejao.newInstance("fisica"));

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View inflated = inflater.inflate(R.layout.fragment_bandejoes, container, false);
    return inflated;    
}

public void notifyFragments(){

    for(int i=0; i<3; i++){     
        ((FragmentRestauranteBandejao) mAdapter.getItem(i)).getDados();
    }

    if(dialog != null){
        dialog.dismiss();
    }

}

public void getCardapios(boolean update){
    if(!USPRestaurantes.getDados() || update){

        boolean request_made = USPRestaurantes.getCardapio(getActivity());
    }
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {

    getCardapios(false);

    viewPager = (ViewPager) getView().findViewById(R.id.pager_bandejoes);

    mAdapter = new TabsPagerAdapter(((MainActivity) getActivity()).fragmentManager, paginasBandeco, tabs);

    viewPager.setAdapter(mAdapter);
    mIndicator = (TabPageIndicator) getActivity().findViewById(R.id.indicator);
    mIndicator.setViewPager(viewPager);

    mIndicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            mIndicator.setCurrentItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {                
        }
    });     
}

Дополнительная информация: Когда я перемещаюсь к другим вкладкам, представление воссоздается, а затем показывает данные. заранее спасибо

1 ответ

Решение

Из того, что я могу сказать, читая ваш код, можно сказать, что вы не учитываете жизненный цикл фрагмента.

Фрагменты, как "Действия", имеют методы жизненного цикла, которые вы должны использовать, чтобы они правильно отображались. Я предлагаю использовать обратный вызов onResume и вместе с ним проверить, есть ли у вас какие-либо данные для отображения. Если вы действительно отображаете их в своем фрагменте. Если вы не делаете то, что делаете, когда создаете фрагмент

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