#java #android #android-studio #kotlin #android-viewpager
#java #Android #android-studio #kotlin #android-просмотрщик
Вопрос:
Я изучаю, как создать библиотеку Android, и я создаю простую встроенную библиотеку. Но у меня проблема с моим ViewPager из моего пользовательского модуля.
Когда я провожу пальцем вправо и влево, мой элемент секунд не отображается, или первый и второй просмотр накладываются друг на друга.
Я не понимаю, откуда берется проблема
[! [введите описание изображения здесь] [2]][2]
[![ ][3]][3]
Основной класс в моей библиотеке:
public class OnBoardingView extends FrameLayout implements LifecycleObserver {
public OnBoardingView(@NonNull Context context) {
super(context, null);
this.initialize(context, null);
}
public OnBoardingView(@NonNull Context context, @NonNull AttributeSet attrs) {
super(context, attrs);
this.initialize(context, attrs);
}
private void initialize(@NonNull Context context, @Nullable AttributeSet attrs) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.onboarding_view_root, this);
List<String> list = new ArrayList<String>();
list.add("Hello world 1");
list.add("Hello world 2");
list.add("Hello world 3");
ViewPager viewPager = findViewById(R.id._screenPager);
OnBoardingAdapter<String> onBoardingAdapter = new OnBoardingAdapter<String>(context, list);
viewPager.setAdapter(onBoardingAdapter);
}
}
Мой адаптер:
public class OnBoardingAdapter<T> extends PagerAdapter {
private Context context;
private List<T> onBoardingList;
public OnBoardingAdapter(Context context, List<T> list) {
this.context = context;
this.onBoardingList = list;
}
@Override
public int getCount() {
return this.onBoardingList.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view.getClass() == object.getClass();
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
View view = LayoutInflater.from(context).inflate(R.layout.onboarding_screen_view, null);
container.addView(view);
return view;
}
}
Мой XML-файл в content ViewPager :
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<androidx.viewpager.widget.ViewPager
android:id="@ id/_screenPager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
Мой XML для каждой страницы:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@ id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="onboarding_screen_view" />
</LinearLayout>
И в главном файле main_activity я вызываю это для отображения моего модуля:
<com.domaine.onboarding.OnBoardingView
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
Комментарии:
1. Для начала попробуйте опубликовать свои коды в виде фрагментов, а не изображений, чтобы их можно было легко прочитать.
2. Привет, извините, я обновил свой вопрос, добавив коды в виде фрагментов.
Ответ №1:
Попробуйте вернуть представление вместо контейнера
Если вы хотите добиться этого легко, попробуйте использовать viewpager2
, вы можете использовать адаптер, аналогичный recyclerview
adapter
https://developer.android.com/training/animation/vp2-migration
Комментарии:
1. Спасибо за ваш комментарий, который я исправил при удалении getClass() из isViewFromObject()