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.
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.
-
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);
-
È 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()); } } }