Il frammento di Listview sta ricominciando a premere il tasto indietro

Sto utilizzando il caricatore nel mio frammento ListView e sta ricreando premendo il button "indietro". Puoi dirmi come gestire questo senario?

Ecco il mio codice di frammento ListView . Qui ho una variabile booleana che sto impostando come true per click sull'elemento dell'elenco. ma una volta premuto il tasto di return onCreateView verrà chiamato in modo che il backbutton sia falso.

  • Riproduci il video HTML5 integrato in Android WebView
  • Ripetere AsyncTask
  • SimpleDraweeView non ridimensiona dopo la scalatura dell'image in affresco
  • Come aggiornare un messaggio di posta elettronica, indirizzo, nickname, ecc di un contatto in Android?
  • Come evitare il limite del metodo 65k durante l'utilizzo di Google Play Services
  • Visualizzare l'elenco degli events all'interno del calendario?
  •  public class GTFragment extends SherlockFragment implements LoaderCallbacks<Cursor>{ ListView mTListview = null; GoogleTasksAdapter mGTasksAdapter = null; private SQLiteCursorLoader mTLoader=null; private LoaderManager mTLoaderManager; private String mSelectedListID = null; private boolean mIsBackbuttonisPressed = false; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.task_home_activity, container, false); if(!mIsBackbuttonisPressed) getLoaderManager().initLoader(0, null, this); mTListview = (ListView) view.findViewById(R.id.id_task_list_home_activity); mGTasksAdapter = new GoogleTasksAdapter(getActivity()); mTListview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> listview, View clickedview, int position, long arg3) { // TODO Auto-generated method stub GoogleTaskItem item = new GoogleTaskItem(); Cursor coursor = ((GoogleTasksAdapter)listview.getAdapter()).getCursor(); if(coursor.moveToPosition(position)) { mIsBackbuttonisPressed = true; GoogleTaskController.get_googletask_controllerObj() .LaunchTaskPreviewActivity(); } } }); mTListview.setAdapter(mGTasksAdapter); mIsBackbuttonisPressed = false; return view; } 

    Il codice della class di attività di frammentazione

     public class TLActivity extends SherlockFragmentActivity { LeftSliderTaskListOptions mTaskOptionsFragment = null; GoogleTasksFragment mTFragment = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); setContentView(R.layout.layout_gt_list); // FragmentTransaction tfragment = this.getSupportFragmentManager().beginTransaction(); mTFragment = new GTasksFragment(); t.replace(R.id.id_tfragment, mTFragment); t.commit(); } 

    3 Solutions collect form web for “Il frammento di Listview sta ricominciando a premere il tasto indietro”

    Hai più opzioni per risolvere questo problema.

    1. Sostituire onSaveInstanceState come questo:

       @Override public void onSaveInstanceState (Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean("mIsBackbuttonisPressed", mIsBackbuttonisPressed); } 

      e poi nel tuo onCreateView è ansible get la tua variabile indietro da:

       if (savedInstanceState != null) mIsBackbuttonisPressed = savedInstanceState.getBoolean("mIsBackbuttonisPressed", false); 
    2. È ansible impostare this.setRetainInstance(true); nel tuo metodo onCreate del tuo frammento.

    Se puoi pubblicare il tuo codice Attività con il tuo frammento, posso anche dirti altre opzioni. (PS non posso scrivere come commento per postarla nella risposta.)

    invece di

     t.replace(R.id.id_tfragment, mTFragment); 

    uso

     t.add(R.id.id_tfragment, mTFragment); 

    Ha funzionato per me

    Non credo che la risposta accettata sia giusta perché Fragment.onSaveInstanceState non verrà chiamato finché l'attività che lo ospita non ha bisogno di salvare il suo stato: I docs affermano:

    Ci sono molte situazioni in cui un frammento può essere per lo più disgregato (ad esempio, quando viene collocato sullo scaffale posteriore senza l'indicazione dell'interface utente), ma il suo stato non verrà salvato finché la sua attività in proprio non ha bisogno di salvare il suo stato.

    In altre parole: se utilizzi un'attività con più frammenti per each schermata (molto comune), lo stato di frammento non verrà salvato quando si sposta la schermata successiva.

    Inoltre non è ansible utilizzare Fragment.setRetainInstance perché intende solo frammenti che non sono sullo background.

    La maggior parte del tempo, non devi pensare a questo ma a volte è importnte. Come quando hai scorciato un elenco e vuoi "ricordare" la posizione di scorrimento.

    Ho impiegato molto tempo per rendermi conto che i frammenti messi sullo stack posteriore sono un po 'salvati e puoi riutilizzare la vista che hai già creato anziché crearla each volta che il frammento chiama onCreateView. La mia configuration è qualcosa di simile:

     public abstract class BaseFragment extends Fragment { private boolean mSaveView = false; private SoftReference<View> mViewReference; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (mSaveView) { if (mViewReference != null) { final View savedView = mViewReference.get(); if (savedView != null) { if (savedView.getParent() != null) { ((ViewGroup) savedView.getParent()).removeView(savedView); return savedView; } } } } final View view = inflater.inflate(getFragmentResource(), container, false); mViewReference = new SoftReference<View>(view); return view; } protected void setSaveView(boolean value) { mSaveView = value; } } public class MyFragment extends BaseFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setSaveView(true); final View view = super.onCreateView(inflater, container, savedInstanceState); ListView placesList = (ListView) view.findViewById(R.id.places_list); if (placesList.getAdapter() == null) { // this check is importnt so you don't restart your adapter placesList.setAdapter(createAdapter()); } } } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.