Не получается добавить динамично LinearLayout на ViewPager в Android Studio
Решил создать первый проект на андроид и возникли трудности (не судите строго)).
Проблема заключается в том, что после отрисовки Activity где в ней уже находится ScrollView, а в ней LinearLayout (через XML). В коде поэтапно добавляются динамически другие View (TextView, Button, ImageView и т.д.) через метод displayAllInfo().
В конце я добавляю LinearLayout в ArrayList.
После этого хочу из листа добавлять во вьюпейджер лаяуты, но тщетно...
Вот как это выглядит:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.info_unit);
linearLayout3 = findViewById(R.id.linearLayout3);
displayAllInfo();
FloatingActionButton fab = findViewById(R.id.fabPlus);
fab.setOnClickListener(v -> {
String id = info.getID().toLowerCase();
tabName = MainActivity.translatorJson.Attempt(id);
MainActivity.tabNameList.add(tabName);
MainActivity.tabContentList.add(linearLayout3);
});
}
Через PageViewModel пытаюсь взять значения из ArrayList:
public class PageViewModel extends ViewModel {
private MutableLiveData<Integer> mIndex = new MutableLiveData<>();
private LiveData<LinearLayout> linearlayout = Transformations.map(mIndex, new Function<Integer, LinearLayout>() {
@Override
public LinearLayout apply(Integer input) {
return MainActivity.tabContentList.get(input - 1);
}
});
public void setIndex(int index) {
mIndex.setValue(index);
}
public LiveData<LinearLayout> getLL() {
return linearlayout;
}
}
И в конечном счете присваиваю это все дело через PlaceHolderFragment:
public class PlaceholderFragment extends Fragment {
private static final String ARG_SECTION_NUMBER = "section_number";
private PageViewModel pageViewModel;
public static PlaceholderFragment newInstance(int index) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle bundle = new Bundle();
bundle.putInt(ARG_SECTION_NUMBER, index);
fragment.setArguments(bundle);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
pageViewModel = new ViewModelProvider(this).get(PageViewModel.class);
int index = 1;
if (getArguments() != null) {
index = getArguments().getInt(ARG_SECTION_NUMBER);
}
pageViewModel.setIndex(index);
}
@Override
public View onCreateView(
@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_compare, container, false);
pageViewModel.getLL().observe(this, new Observer<LinearLayout>() {
@Override
public void onChanged(LinearLayout linearLayout) {
LinearLayout ll = root.findViewById(R.id.linearLayout4);
ll.removeAllViews();
//ll = linearLayout;
ll.addView(linearLayout, ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
});
return root;
}
}
linearLayout4 это пустая вьюха для отрисовки полученной linearLayout. Для PageView отдельная активность (activity_compare, а в ней лежит fragment_compare). Была создана через шаблон Android Studio Tabbed Activity. И при ее открытии выскакивет ошибка. Вот последние строки дебагера:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.view.ViewGroup.addViewInner(ViewGroup.java:5106)
at android.view.ViewGroup.addView(ViewGroup.java:4935)
at android.view.ViewGroup.addView(ViewGroup.java:4892)
at com.sashantgroup.fafwiki.ui.main.PlaceholderFragment$2.onChanged(PlaceholderFragment.java:67)
at com.sashantgroup.fafwiki.ui.main.PlaceholderFragment$2.onChanged(PlaceholderFragment.java:61)
Прошу помощи (уже месяц не могу победить проблему), заранее спасибо!)
Ответы (1 шт):
В общем, решил проблему вынесением того что находилось в активити в отдельный класс, и данные передавал как экземпляр класса со свойствами через геттеры и сеттеры. Собственно этот класс и пропихивал в лист вместо linearLayout3. @ЮрийСПб спасибо то что направили в верное русло :)