У меня сложный макет для реализации. Он имеет 19 разделов, которые могут отображаться или не отображаться в зависимости от множества параметров, ранее введенных пользователем. Чтобы упростить код и не отображать неиспользуемые разделы, макет создается динамически.
Все внутри фрагмента. Фрагмент имеет LinearLayout, используемый в качестве контейнера, и при создании фрагмента я генерирую все необходимые разделы.
Каждый раздел управляется собственным локальным адаптером, который отвечает за расширение макета этого раздела и добавление его в контейнер.
Все работает отлично. Проблема в том, что 2 раздела имеют одинаковую структуру, поэтому они имеют один и тот же макет xml. Из-за этого внутренние виды обоих разделов имеют одинаковый идентификатор. Это не проблема, так как раздел управляется локально в его адаптере. Проблема возникает, когда я перехожу к следующему фрагменту, а затем возвращаюсь к этому. Система пытается восстановить предыдущее состояние представления, и, поскольку эти 2 раздела имеют одинаковые идентификаторы, при восстановлении второго раздела его значения также устанавливаются равными первому.
Есть ли какое-либо решение, чтобы управлять этим или сказать фрагменту не восстанавливать свое состояние (поскольку все равно все перезагружается вручную).
Вот легкий пример текущей структуры:
фрагмент xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Раздел XML
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/section_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
код фрагмента
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_layout, container, false);
if (<condition>)
createSection1(getContext(),view);
if (<condition>)
createSection2(getContext(),view);
return view;
}
private void createSection1(Context context, ViewGroup root){
Section1Adapter adapter = new Section1Adapter(context, root);
// ...
}
private void createSection2(Context context, ViewGroup root){
Section2Adapter adapter = new Section2Adapter(context, root);
// ...
}
код адаптера (одна и та же идея для обоих)
public Section2Adapter(LayoutInflater inflater, ViewGroup root) {
View view = LayoutInflater.from(context).inflate(R.layout.section_layout, root, false);
initView(view);
root.addView(view);
}