Сохранение карты после ориентации экрана
У меня есть фрагмент, который делает асинхронный вызов, присваивает объектную переменную (что заняло у меня некоторое время, чтобы выяснить), а затем, нажав на кнопку, он загружает cardviews
через адаптеры на экран.
Код, который я использую:
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragments_stops_list, container, false);
ButterKnife.bind(this, view); // since this is a fragment the butterknife bind method should goafter the view declaration
// saved state would indicate that we are now not capable of making multiple requests. This point has been
// properly taken care of and now I can purposely move on to other things of more importance
loadButton = (Button) view.findViewById(R.id.LOAD);
if(savedInstanceState == null) {
loadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d(">==========<", extractCreate.getCreateR().getPhone());
Parcelable[] parcelable = extractCreate.getStopsR();
commodities = Arrays.copyOf(parcelable, parcelable.length, Stops[].class);
//Log.d("Commodities size check", String.valueOf(commodities.length));
StopsAdapter adapter = new StopsAdapter(commodities);
mRecyclerView.setAdapter(adapter);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); // sketchy on this part
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setHasFixedSize(true);
Log.d(TAG, "This is being called from the onCreate method");
}
});
}
return view;
}
Дело в том, что если я попытаюсь повернуть экран, содержимое исчезнет, и чтобы они снова появились, нужно нажать кнопку (или id.LOAD
), Я добавил оператор, чтобы проверить, имеет ли состояние saveInstance значение NULL, это решение не работает, как сейчас, когда я поворачиваю экран cardviews
то, что я загружаю через адаптер исчезают и нет возможности загрузить их снова.
Как я могу сохранить государство? Я читал о переопределении onViewStateRestored
метод, но идея не кажется многообещающей, так как содержимое должно быть обработано внутри слушателя щелчка.
Любые предложения будут с благодарностью.
По запросу это код.
public class Stops implements Parcelable{
private String stop_id;
private String type;
private String location;
private String address;
private String city;
private String state;
private String zip;
private String from;
private String to;
private String getitem;
private Commodities[] commodities;
public Stops() {}
public String getStop_id() {
return stop_id;
}
public void setStop_id(String stop_id) {
this.stop_id = stop_id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getZip() {
return zip;
}
public void setZip(String zip) {
this.zip = zip;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public Commodities[] getCommodities() {
return commodities;
}
public void setCommodities(Commodities[] commodities) {
this.commodities = commodities;
}
/**
* The content for the actual parcelables start in here
*
* */
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.stop_id);
dest.writeString(this.type);
dest.writeString(this.location);
dest.writeString(this.address);
dest.writeString(this.city);
dest.writeString(this.state);
dest.writeString(this.zip);
dest.writeString(this.from);
dest.writeString(this.to);
dest.writeString(this.getitem);
dest.writeTypedArray(this.commodities, flags);
}
protected Stops(Parcel in) {
this.stop_id = in.readString();
this.type = in.readString();
this.location = in.readString();
this.address = in.readString();
this.city = in.readString();
this.state = in.readString();
this.zip = in.readString();
this.from = in.readString();
this.to = in.readString();
this.getitem = in.readString();
this.commodities = in.createTypedArray(Commodities.CREATOR);
}
public static final Parcelable.Creator<Stops> CREATOR = new Parcelable.Creator<Stops>() {
@Override
public Stops createFromParcel(Parcel source) {
return new Stops(source);
}
@Override
public Stops[] newArray(int size) {
return new Stops[size];
}
};
}
2 ответа
В связи с тем, что ваш фрагмент уничтожается и создается заново при изменении ориентации, вам необходимо реализовать некоторую логику, чтобы сохранить данные, которые вы собрали до события изменения ориентации.
Это делается путем переопределения метода onSavedInstanceState(Bundle bundle). Все, что вам нужно сохранить, включено здесь. Вы помещаете свои данные в объект Bundle и назначаете ему ключ, чтобы иметь возможность получить его в последнее время.
Когда ОС снова создаст ваш фрагмент, она снова пройдет через метод onCreateView(). Это место, где вы должны проверить, не является ли объект selectedInstanceState не равным NULL. Если это не так, то, скорее всего, он содержит некоторые данные, которые были сохранены до того, как произошло событие изменения ориентации.
Проверьте следующую суть.
public class SomeClass extends Activity {
private static final String KEY = "some_key";
commodities;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragments_stops_list, container, false);
ButterKnife.bind(this, view); // since this is a fragment the butterknife bind method should goafter the view declaration
// saved state would indicate that we are now not capable of making multiple requests. This point has been
// properly taken care of and now I can purposely move on to other things of more importance
loadButton = (Button) view.findViewById(R.id.LOAD);
if(savedInstanceState == null) {
loadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d(">==========<", extractCreate.getCreateR().getPhone());
Parcelable[] parcelable = extractCreate.getStopsR();
commodities = Arrays.copyOf(parcelable, parcelable.length, Stops[].class);
//Log.d("Commodities size check", String.valueOf(commodities.length));
StopsAdapter adapter = new StopsAdapter(commodities);
mRecyclerView.setAdapter(adapter);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); // sketchy on this part
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setHasFixedSize(true);
Log.d(TAG, "This is being called from the onCreate method");
}
});
} else {
if(savedInstanceState.containsKey(KEY)) {
commodities = savedInstanceState.getParcelable(KEY);
// here you will pretty much repete the code from above
// for creating an Adapter for the RecyclerView
StopsAdapter adapter = new StopsAdapter(commodities);
mRecyclerView.setAdapter(adapter);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); // sketchy on this part
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setHasFixedSize(true);
}
}
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(KEY, commodities);
}
}
Чтобы правильно сохранить ваши данные, ваш товарный класс должен реализовывать Parcelable. Проверьте эту ссылку для получения дополнительной информации. Parcelable
PS Из-за того, что я не знаю фактический тип вашего товара, вам придется немного исправить код. Простая копия -> вставка не сработает!
Поместите это в свой тег активности манифеста
android:configChanges="orientation|keyboardHidden|screenSize"
Надеюсь, что это поможет.