Я знаю, что этот вопрос задавался раньше, но ни один из ответов, данных до сих пор, мне ничем не помог.
У меня есть viewpager, который заполнен фрагментами (android.support.v4.app.Fragment) из FragmentStatePagerAdapter . Некоторые из этих фрагментов содержат логику, которую необходимо сохранять при изменении ориентации, например отслеживание того, какой вид выбран в данный момент.
Однако, хотя я сохраняю рассматриваемые данные в onSaveInstanceState, saveInstanceState всегда имеет значение null. Я могу решить эту проблему, сохранив данные в статической переменной (что, поскольку у меня есть только один экземпляр каждого фрагмента, будет работать для меня), но я обнаружил, что это довольно уродливое решение, и должен быть правильный способ сделать это.
Это один из фрагментов, который не сохраняет свое состояние при вращении:
public class PriceSelectFragment extends Fragment {
private TableRow mSelected;
private int mSelectedPos = 0;
// newInstance constructor for creating fragment with arguments
public static PriceSelectFragment newInstance() {
PriceSelectFragment fragmentFirst = new PriceSelectFragment();
return fragmentFirst;
}
public PriceSelectFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_price_select, container, false);
TableLayout mTable = (TableLayout)view.findViewById(R.id.price_table);
List<PriceGroup> mPriceGroups = ((MainActivity) getActivity()).getPriceGroups();
int i = 0;
for (final PriceGroup group : mPriceGroups) {
//Create row from layout and access child TextViews
TableRow r = (TableRow)inflater.inflate( R.layout.price_group, mTable, false);
TextView size = (TextView)r.getChildAt(0);
TextView dimension = (TextView)r.getChildAt(1);
TextView weight = (TextView)r.getChildAt(2);
TextView price = (TextView)r.getChildAt(3);
//Populate row with PriceGroup Data
size.setText(group.sizeIndicator);
dimension.setText(String.format("%2.0fx%2.0fx%2.0f", group.length, group.width, group.height));
weight.setText(Float.toString(group.weight));
price.setText(Integer.toString(group.price));
//Alternate background color every other row
if (i % 2 == 0) {
r.setBackgroundDrawable(getResources().getDrawable(R.drawable.price_selector_1));
}
else {
r.setBackgroundDrawable(getResources().getDrawable(R.drawable.price_selector_2));
}
mTable.addView(r); // Add to table
r.setTag(i);
r.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selectRow((TableRow) v);
}
});
i++;
}
mSelected = (TableRow)view.findViewWithTag(mSelectedPos);
selectRow(mSelected);
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("selected", mSelectedPos);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
mSelectedPos = savedInstanceState.getInt("selected");
}
}
private void selectRow(TableRow row) {
if ((int) mSelected.getTag() % 2 == 0) {
mSelected.setBackgroundDrawable(getResources().getDrawable(R.drawable.price_selector_1));
}
else {
mSelected.setBackgroundDrawable(getResources().getDrawable(R.drawable.price_selector_2));
}
mSelected = row;
mSelectedPos = (int) mSelected.getTag();
mSelected.setBackgroundColor(getResources().getColor(R.color.light_blue));
}
}
Как мне решить эту проблему, не сохраняя свои состояния в статических переменных?
Редактировать
Я должен указать, что все фрагменты создаются программно, и поэтому у них нет идентификатора, и я читал, что это может быть проблемой, но я также не знаю, как это решить.
Также мое приложение структурировано следующим образом:
- MainActivity with NavigationDrawer
- Fragment1
- ViewPager
- subfragment1 - subfragment5
- ViewPager
- Фрагмент2
- Фрагмент3
- Fragment1
Фрагменты, с состояниями которых у меня возникают проблемы, являются подфрагментами.
onSaveInstanceState
деятельности? - person Dreagen   schedule 29.04.2015