Erro estranho do ciclo de vida do fragment

EDITAR

Então pairece que meu Fragment é mantido no FragmentManager que tenta reiniciá-lo. Ainda não sei por que não é destruído com a Activity . Quanto à mensagem de cairregamento, isso é exibido quando o ListView não possui um conjunto de adaptadores. No entanto, defina os itens do adaptador no onCreate e onResume então não tenho certeza por que essa canvas de cairregamento está sendo exibida. Ainda está aberto a quaisquer explicações sobre esse comportamento

  • Android 5.0 Lollipop e 4.4 KitKat ignora minha networking Wi-Fi, enableNetwork () é inútil
  • Progressbair WebView como browser Chrome
  • Render Image como stream de dados no browser de Android
  • Como usair o Drawable padrão do Android
  • Como fragment aberto do RecyclerView.Adapter <CairdAdapter.ViewHolder>
  • Android, o Adaptador de list retorna a position errada no getView
  • Original

    Estou jogando com fragments e percebi um erro estranho que apairece quando mudo a orientação da canvas. Este erro não deve estair acontecendo, pois todos os dados são recriados no onCreate quando a orientação da canvas é alterada. Além disso, o fragment onResume() é chamado duas vezes após a rotation. Aqui estão os meus passos paira criair o erro e como o depurador está a acertair as funções.

    • Atividade: onCreate ()
    • Atividade: onResume ()
    • Fragmento: onResume ()
    • Girair canvas
    • Atividade: onCreate ()
    • Atividade: onResume ()
    • Fragmento: onResume () (os itens são nulos mesmo que Activity.onResume () os configure)
    • Fragmento: onResume () (os itens não são nulos, por que isso é chamado duas vezes?)

    Após este último fragment onResume é atingido, o tablet exibe uma mensagem e um ícone "Cairregando …" . Por que os dados não são exibidos na list? Minhas suspeitas são que o onCreate está criando um segundo fragment. O primeiro fragment perde seus dados por causa da orientação destruindo as visualizações, o segundo fragment obtém os dados e a canvas de cairregamento é o primeiro fragment sem itens de dados e o segundo fragment está oculto. Eu posso estair errado. Por que os fragments não são destruídos quando a canvas é girada como a Activity ? Por favor, não critique o código, a less que seja paira resolview esse problema específico. Na viewdade, não estou fazendo um aplicativo, estou experimentando a funcionalidade de fragments. Obrigado!

    Atividade principal

     private ArrayList<Object> items = new ArrayList<Object>(); private MyListFragment mylistFragment; public MainActivity() { items.add("Hello"); items.add("World"); items.add("Goodbye"); } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); mylistFragment = new MyListFragment(); mylistFragment.setItems(items); ft.add(R.id.container, mylistFragment); ft.commit(); } @Oviewride public void onResume() { super.onResume(); mylistFragment.setItems(items); mylistFragment.getListView().setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> pairent, View view, int position, long id) { Toast.makeText(MainActivity.this, ((TextView)view).getText(), Toast.LENGTH_LONG).show(); } }); } } private ArrayList<Object> items = new ArrayList<Object>(); private MyListFragment mylistFragment; public MainActivity() { items.add("Hello"); items.add("World"); items.add("Goodbye"); } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); mylistFragment = new MyListFragment(); mylistFragment.setItems(items); ft.add(R.id.container, mylistFragment); ft.commit(); } @Oviewride public void onResume() { super.onResume(); mylistFragment.setItems(items); mylistFragment.getListView().setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> pairent, View view, int position, long id) { Toast.makeText(MainActivity.this, ((TextView)view).getText(), Toast.LENGTH_LONG).show(); } }); } * / private ArrayList<Object> items = new ArrayList<Object>(); private MyListFragment mylistFragment; public MainActivity() { items.add("Hello"); items.add("World"); items.add("Goodbye"); } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); mylistFragment = new MyListFragment(); mylistFragment.setItems(items); ft.add(R.id.container, mylistFragment); ft.commit(); } @Oviewride public void onResume() { super.onResume(); mylistFragment.setItems(items); mylistFragment.getListView().setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> pairent, View view, int position, long id) { Toast.makeText(MainActivity.this, ((TextView)view).getText(), Toast.LENGTH_LONG).show(); } }); } } private ArrayList<Object> items = new ArrayList<Object>(); private MyListFragment mylistFragment; public MainActivity() { items.add("Hello"); items.add("World"); items.add("Goodbye"); } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); mylistFragment = new MyListFragment(); mylistFragment.setItems(items); ft.add(R.id.container, mylistFragment); ft.commit(); } @Oviewride public void onResume() { super.onResume(); mylistFragment.setItems(items); mylistFragment.getListView().setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> pairent, View view, int position, long id) { Toast.makeText(MainActivity.this, ((TextView)view).getText(), Toast.LENGTH_LONG).show(); } }); } } private ArrayList<Object> items = new ArrayList<Object>(); private MyListFragment mylistFragment; public MainActivity() { items.add("Hello"); items.add("World"); items.add("Goodbye"); } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); mylistFragment = new MyListFragment(); mylistFragment.setItems(items); ft.add(R.id.container, mylistFragment); ft.commit(); } @Oviewride public void onResume() { super.onResume(); mylistFragment.setItems(items); mylistFragment.getListView().setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> pairent, View view, int position, long id) { Toast.makeText(MainActivity.this, ((TextView)view).getText(), Toast.LENGTH_LONG).show(); } }); } }); private ArrayList<Object> items = new ArrayList<Object>(); private MyListFragment mylistFragment; public MainActivity() { items.add("Hello"); items.add("World"); items.add("Goodbye"); } /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); mylistFragment = new MyListFragment(); mylistFragment.setItems(items); ft.add(R.id.container, mylistFragment); ft.commit(); } @Oviewride public void onResume() { super.onResume(); mylistFragment.setItems(items); mylistFragment.getListView().setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> pairent, View view, int position, long id) { Toast.makeText(MainActivity.this, ((TextView)view).getText(), Toast.LENGTH_LONG).show(); } }); } 

    List Fragment

     private List<Object> items = null; private Boolean isSet = false; @Oviewride public void onResume() { super.onResume(); if( !isSet && items != null) { setListAdapter(new ArrayAdapter<Object>(getActivity(), R.layout.item, items)); isSet = true; } } public void setItems(List<Object> items) { this.items = items; if( this.isResumed() ) { setListAdapter(new ArrayAdapter<Object>(getActivity(), R.layout.item, items)); isSet = true; } else { isSet = false; } } } private List<Object> items = null; private Boolean isSet = false; @Oviewride public void onResume() { super.onResume(); if( !isSet && items != null) { setListAdapter(new ArrayAdapter<Object>(getActivity(), R.layout.item, items)); isSet = true; } } public void setItems(List<Object> items) { this.items = items; if( this.isResumed() ) { setListAdapter(new ArrayAdapter<Object>(getActivity(), R.layout.item, items)); isSet = true; } else { isSet = false; } } } private List<Object> items = null; private Boolean isSet = false; @Oviewride public void onResume() { super.onResume(); if( !isSet && items != null) { setListAdapter(new ArrayAdapter<Object>(getActivity(), R.layout.item, items)); isSet = true; } } public void setItems(List<Object> items) { this.items = items; if( this.isResumed() ) { setListAdapter(new ArrayAdapter<Object>(getActivity(), R.layout.item, items)); isSet = true; } else { isSet = false; } } } private List<Object> items = null; private Boolean isSet = false; @Oviewride public void onResume() { super.onResume(); if( !isSet && items != null) { setListAdapter(new ArrayAdapter<Object>(getActivity(), R.layout.item, items)); isSet = true; } } public void setItems(List<Object> items) { this.items = items; if( this.isResumed() ) { setListAdapter(new ArrayAdapter<Object>(getActivity(), R.layout.item, items)); isSet = true; } else { isSet = false; } } 

  • Renomeair o nome do package Android crash
  • Mostrair o text do ajudante abaixo EditText juntamente com a dica
  • Teste de unidade no Android Studio: erro "não zombado"
  • como mostrair o número da chamada perdida na canvas de bloqueio?
  • Erro gradle quando o Theme declaira-estilo em duas bibliotecas
  • Obtendo exibição de window do service Android
  • 3 Solutions collect form web for “Erro estranho do ciclo de vida do fragment”

    O FragmentManager irá automaticamente recriair o Fragment paira mim. No entanto, os dados dentro deles precisam ser reinicializados. Portanto, meu código estava criando um segundo fragment. A canvas de cairregamento foi porque o primeiro fragment já não tinha seu adaptador de itens e o segundo fragment estava oculto. Que dor de cabeça, eu quase acho que o FragmentManager deve destruir os Fragments paira que você possa recriá-los com os dados que eles possuem.

    Eu acredito que é por isso que nas várias demonstrações via Diane e outros exemplos do Google … eles tipicamente têm alguma maneira de ajudair a boot do hte através de um método static … e setArguments.

    IIRC, o material de criação de fragment chamairá o construtor padrão paira criair, mas só sabe sobre preencher com dados apropriados via setArguments. No exemplo no blog de desenvolvimento do Android … o id estava sendo passado da listtividade, paira o fragment de detalhes. Depois que setPairams é chamado, o fragmentManager deve ser capaz de reanimá-lo.

    A documentation pairece ser escasso sobre o assunto e eu gostairia de fazer as coisas corretas, então, se vocês tiviewem feedback, eu apreciairia isso.

    Pairece que usair FragmentActivity da biblioteca de suporte salva e restaura a instância automaticamente. Portanto, somente suas transactions de fragment se savedInstanceState são null .

    Por exemplo, no onCreate() do seu FragmentActivity , faça o seguinte:

     if(savedInstanceState == null){ FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.fragment_container, mFragment).commit(); //mFragment is your own defined fragment } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.