J'expérimente des fragments. Je MainActivity composé d'un framelayout qui échange en fragments (maître "SearchFragment" et détail "LyricsFragment"):Comment ce fragment peut-il conserver son état lors de la rotation?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fragmentManager = getSupportFragmentManager();
int index = fragmentManager.getBackStackEntryCount() - 1;
if (index == -1) {
fragmentManager.beginTransaction()
.replace(R.id.placeholder, new SearchFragment(), SEARCH)
.commit();
} else {
FragmentManager.BackStackEntry backEntry = fragmentManager.getBackStackEntryAt(index);
String tag = backEntry.getName();
Fragment fragment = fragmentManager.findFragmentByTag(tag);
if (fragment != null) {
fragmentManager.beginTransaction()
.replace(R.id.placeholder, fragment)
.commit();
}
}
}
J'utilise https://github.com/frankiesardo/icepick pour sauver mon état de SearchFragment dans un arrayList:
public class SearchFragment extends Fragment {
@Inject CompositeSubscription subscriptions;
@BindView(R.id.search_field) EditText searchField;
@BindView(R.id.recyclerview) RecyclerView recyclerView;
@State ArrayList<Track> tracks = new ArrayList<>();
private TrackAdapter adapter;
private TrackClickListener listener;
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof TrackClickListener) {
listener = (TrackClickListener) context;
} else {
throw new IllegalArgumentException("context must be of type TrackClickListener");
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_search, container, false);
bindViews(view);
adapter = new TrackAdapter(listener, picasso);
recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), COLS));
recyclerView.setAdapter(adapter);
Log.d("TRACK", "tracks.size=" + tracks.size());
adapter.setAdapterItems(tracks);
return view;
}
@VisibleForTesting
void onSearchSuccess(ArrayList<Track> tracks) {
this.tracks = tracks;
adapter.setAdapterItems(tracks);
}
@OnClick(R.id.search_button)
void onSearchClick() {
searchTracks();
}
private void searchTracks() {
subscriptions.add(api.searchTracks(searchTerm)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<SearchResult>() {
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(SearchResult searchResult) {
onSearchSuccess(searchResult.getResults());
}
}));
}
public interface TrackClickListener {
void startDetailScreen(Track track);
}
}
quelqu'un peut-il expliquer pourquoi les impressions des états de journal sur cette rotation:
tracks.size = 20 ---- ---- SCREEN tOURNER tracks.size = 20 tracks.size = 0
La liste est conservée au début mais finit par être effacée. Comment puis-je préserver le recyclaged peuplé après que je tourne? La librairie que j'utilise évite le standard de saveInstanceState. Je m'attendais à enregistrer ma liste et à la réinitialiser avec l'adaptateur lorsque l'appareil est pivoté.
J'ai cela, mais ne mentionnaient pas dans la pâte – Marc