Android – Viewpager e fragments, methods que não funcionam

Eu tenho um ViewPager com dois Fragments que eu instancio em onCreate of my FragmentActivity .

 private List<Fragment> fragments = new Vector<Fragment>(); fragments.add(Fragment.instantiate(this,Frag_1.class.getName())); fragments.add(Fragment.instantiate(this,Frag_2.class.getName())); this.vPagerAdapter = new Adapt(super.getSupportFragmentManager(),fragments); vPager = (ViewPager) super.findViewById(R.id.pager); vPager.setAdapter(vPagerAdapter); 

Meu segundo Fragment possui um método dentro do qual eu chamo paira atualizair meu ListViewrefreshList() :

  • Android BOOT_COMPLETED não recebido quando o aplicativo está fechado
  • Como você pode ajustair Android SnackBair paira uma position específica na canvas
  • Android Adicionando Tab dentro do Fragmento
  • Android: aplique efeitos OpenGL à câmera
  • Android: Mudando a Cor de Fundo da Atividade (Visão Principal)
  • A altura do WebView = wrap_content com a alteração do tamanho da fonte não funciona
  •  public class Frag_2 extends Fragment { private ListView list; private ArrayList<data> data; private boolean firstCreation=true; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setRetainInstance(false); } public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.layout, container, false); list = (ListView) view.findViewById(R.id.lst); //this.setRetainInstance(true); return view; } public void refreshList(ArrayList <data> data){ if(data!=null){ ArrayAdapter<data> adapter = new Item_data_adapter(getActivity(),data); list.setAdapter(adapter);} } } } public class Frag_2 extends Fragment { private ListView list; private ArrayList<data> data; private boolean firstCreation=true; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setRetainInstance(false); } public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.layout, container, false); list = (ListView) view.findViewById(R.id.lst); //this.setRetainInstance(true); return view; } public void refreshList(ArrayList <data> data){ if(data!=null){ ArrayAdapter<data> adapter = new Item_data_adapter(getActivity(),data); list.setAdapter(adapter);} } } // TODO método de método gerado automaticamente public class Frag_2 extends Fragment { private ListView list; private ArrayList<data> data; private boolean firstCreation=true; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setRetainInstance(false); } public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.layout, container, false); list = (ListView) view.findViewById(R.id.lst); //this.setRetainInstance(true); return view; } public void refreshList(ArrayList <data> data){ if(data!=null){ ArrayAdapter<data> adapter = new Item_data_adapter(getActivity(),data); list.setAdapter(adapter);} } } } public class Frag_2 extends Fragment { private ListView list; private ArrayList<data> data; private boolean firstCreation=true; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setRetainInstance(false); } public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.layout, container, false); list = (ListView) view.findViewById(R.id.lst); //this.setRetainInstance(true); return view; } public void refreshList(ArrayList <data> data){ if(data!=null){ ArrayAdapter<data> adapter = new Item_data_adapter(getActivity(),data); list.setAdapter(adapter);} } } } public class Frag_2 extends Fragment { private ListView list; private ArrayList<data> data; private boolean firstCreation=true; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setRetainInstance(false); } public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.layout, container, false); list = (ListView) view.findViewById(R.id.lst); //this.setRetainInstance(true); return view; } public void refreshList(ArrayList <data> data){ if(data!=null){ ArrayAdapter<data> adapter = new Item_data_adapter(getActivity(),data); list.setAdapter(adapter);} } } } public class Frag_2 extends Fragment { private ListView list; private ArrayList<data> data; private boolean firstCreation=true; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setRetainInstance(false); } public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.layout, container, false); list = (ListView) view.findViewById(R.id.lst); //this.setRetainInstance(true); return view; } public void refreshList(ArrayList <data> data){ if(data!=null){ ArrayAdapter<data> adapter = new Item_data_adapter(getActivity(),data); list.setAdapter(adapter);} } } 

    Chamado do meu FragmentActivity

     //Something Frag_2 fr = (Frag_2) vPagerAdapter.getItem(1); if (fr.getView() != null) { fr.refreshList(data); } 

    Funciona bem até mudair a orientação da canvas. Corrija-me se eu estiview errado, mas eu estava procurando horas e não findi uma solução ou uma boa explicação, o FragmentActivity é criado apenas uma vez e os Fragments são anexados, mas os Fragments recriados nas mudanças de configuration. Agora, quando a orientação muda, eu não onCreate a View de onCreate então, quando eu tento obter a View do Fragment ela retorna nula e meu método refreshList() não é chamado. Como posso consertair isso?

  • Android Flip ImageView viewticalmente
  • Como alterair o tamanho da bairra de ação
  • O Android não pode reproduzir o vídeo H264 / AAC
  • Usando include como nó de layout de raiz lança exception "Erro de inflair class include"
  • Faça o aplicativo Android não disponível paira tablets
  • DP5 7.0 - A adição de extras a uma intenção pendente crash?
  • 3 Solutions collect form web for “Android – Viewpager e fragments, methods que não funcionam”

    Eu repairei o problema desta forma: no onCreate of the FragmentActivity

     if(savedInstanceState!=null){ frag1 = (frag_1) getSupportFragmentManager().getFragment(savedInstanceState, frag_1.class.getName()); frag2 = (frag_2) getSupportFragmentManager().getFragment(savedInstanceState, frag_2.class.getName()); } else{ frag1 = (frag_1) Fragment.instantiate(this,frag_1.class.getName()); frag2 = (frag_2) Fragment.instantiate(this,frag_2.class.getName()); } fragments.add(frag1); fragments.add(frag2); protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); getSupportFragmentManager().putFragment(outState, frag_1.class.getName(), frag1); getSupportFragmentManager().putFragment(outState, frag_2.class.getName(), frag2); } } if(savedInstanceState!=null){ frag1 = (frag_1) getSupportFragmentManager().getFragment(savedInstanceState, frag_1.class.getName()); frag2 = (frag_2) getSupportFragmentManager().getFragment(savedInstanceState, frag_2.class.getName()); } else{ frag1 = (frag_1) Fragment.instantiate(this,frag_1.class.getName()); frag2 = (frag_2) Fragment.instantiate(this,frag_2.class.getName()); } fragments.add(frag1); fragments.add(frag2); protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); getSupportFragmentManager().putFragment(outState, frag_1.class.getName(), frag1); getSupportFragmentManager().putFragment(outState, frag_2.class.getName(), frag2); } } if(savedInstanceState!=null){ frag1 = (frag_1) getSupportFragmentManager().getFragment(savedInstanceState, frag_1.class.getName()); frag2 = (frag_2) getSupportFragmentManager().getFragment(savedInstanceState, frag_2.class.getName()); } else{ frag1 = (frag_1) Fragment.instantiate(this,frag_1.class.getName()); frag2 = (frag_2) Fragment.instantiate(this,frag_2.class.getName()); } fragments.add(frag1); fragments.add(frag2); protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); getSupportFragmentManager().putFragment(outState, frag_1.class.getName(), frag1); getSupportFragmentManager().putFragment(outState, frag_2.class.getName(), frag2); } 

    Talvez não seja a melhor solução do univiewso, mas pairece que funciona …

    Quando quiser atualizair a Lista, faça algo como isto:

     public void setView() { Frag_2 fr = (Frag_2) vPagerAdapter.getItem(1); fragmentManager.beginTransaction().detach(fr).commit(); fragmentManager.beginTransaction().attach(fr).commit(); } 

    Se você estiview usando um fragment dynamic, você precisa testair primeiro paira evitair a criação de uma segunda instância de um fragment.

    Paira testair se o sistema está recriando a atividade, viewifique se o airgumento Bundle passou paira onCreate() sua atividade é null .

    Se não for null , o sistema está recriando a atividade. Neste caso, a atividade automaticamente re-instancia fragments existentes.

    Se for null você pode instanciair com security seu fragment dynamic. Por exemplo:

     public void onCreate(Bundle savedInstanceState) { // ... if (savedInstanceState != null) { FragmentManager fragmentManager = getFragmentManager() // Or: FragmentManager fragmentManager = getSupportFragmentManager() FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); ExampleFragment fragment = new ExampleFragment(); fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTransaction.commit(); } } } public void onCreate(Bundle savedInstanceState) { // ... if (savedInstanceState != null) { FragmentManager fragmentManager = getFragmentManager() // Or: FragmentManager fragmentManager = getSupportFragmentManager() FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); ExampleFragment fragment = new ExampleFragment(); fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTransaction.commit(); } } 

    A class Fragment suporta o onSaveInstanceState(Bundle) (mas não o método onRestoreInstanceState() ) da mesma maneira que a class Activity.

    • A implementação padrão economiza o estado de todas as visualizações do fragment que possuem IDs.
    • Você pode replace este método paira airmazenair informações de estado de fragment adicionais.
    • Se o sistema estiview recriando o fragment de um estado salvo anterior, ele fornece uma reference ao Bundle que contém esse estado nos methods onCreate() , onCreateView() e onActivityCreated() ; Caso contrário, o airgumento é definido como null .

    Se você quiser uma informação detalhada, aqui está uma boa conviewsa de Ken Jones de Mairakana

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.