У меня есть ViewPager
, и я использую его для перелистывания между видами, а не фрагментами.
И когда я даю View Pager
высоту wrap_content, он ничего не показывает. Поэтому мне пришлось задать ему фиксированную высоту. Но у меня была другая проблема: когда высота элемента больше фиксированной, представление отображается некорректно (и я использую TextView
в качестве представления). Итак, что мне делать, чтобы высота ViewPager
была равна максимальной.
Я использую PagerAdapter
, как показано ниже.
public class IndicatorViewPagerAdapter extends PagerAdapter {
private Context context;
public int[] images = {R.drawable.userprofile,R.drawable.userprofile,R.drawable.userprofile,R.drawable.userprofile,R.drawable.userprofile};
public int[] texts = {R.string.first_text,R.string.second_text,R.string.third_text,R.string.fourth_text,R.string.fifth_text};
LayoutInflater layoutInflater;
Typeface typeface;
String lang;
public IndicatorViewPagerAdapter(Context context,String lang) {
this.context = context;
this.lang=lang;
}
@Override
public int getCount() {
return texts.length;
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view==object;
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = layoutInflater.inflate(R.layout.feeds_item_layout,null);
ImageView imageView = view.findViewById(R.id.image);
TextView textView = view.findViewById(R.id.desc);
imageView.setImageResource(images[position]);
String text = context.getResources().getString(texts[position]);
Log.e("text"," "+text);
textView.setText(text);
//ViewPager viewPager = (ViewPager) container;
if (lang.equals("en")) {
typeface = ResourcesCompat.getFont(context, R.font.knowledge_regular);
}
else {
typeface = ResourcesCompat.getFont(context, R.font.thesans_plain);
}
textView.setTypeface(typeface);
container.addView(view);
return view;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
ViewPager viewPager = (ViewPager) container;
View view = (View) object;
viewPager.removeView(view);
}
}
и здесь я использую ViewPager
в XML
<LinearLayout
android:layout_width = "match_parent"
android:layout_height = "@dimen/_150sdp"
android:layout_marginTop = "10dp"
android:background = "#85d7d5d6"
android:orientation = "horizontal"
android:padding = "10dp">
<TextView
android:id = "@+id/leftArrowTv"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_gravity = "center"
android:textColor = "@color/arrow_color"
android:textSize = "@dimen/_20ssp" />
<androidx.viewpager.widget.ViewPager
android:id = "@+id/viewPager"
android:layout_width = "0dp"
android:layout_height = "wrap_content"
android:layout_weight = "1" />
<TextView
android:id = "@+id/rightArrowTv"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_gravity = "center"
android:textColor = "@color/arrow_color"
android:textSize = "@dimen/_20ssp" />
</LinearLayout>
Попробуйте предоставить родительский вид инфляции следующим образом: View view = layoutInflater.inflate(R.layout.feeds_item_layout, container);
@Cheticamp Я уже добавил эту строку в код, пожалуйста, посмотрите ее еще раз
Я не вижу этой линии. Я вижу что-то в строке с null
в качестве второго аргумента, но не то, что я предлагаю с container
в качестве второго аргумента.
@Cheticamp, когда я добавляю контейнер, я получаю эту ошибку lang.IllegalStateException: у указанного дочернего элемента уже есть родитель. Вы должны сначала вызвать removeView () для родительского элемента ребенка.
Установка false
в качестве третьего параметра для inflate()
, вероятно, избавит от этой проблемы, но ,. После размышлений, я не думаю, что это твоя проблема.
Почему бы не использовать ScrollView в качестве корневого элемента представления страницы ViewPager
@Zain Я использую NestedScrollView <androidx.core.widget.NestedScrollView android: layout_width = "match_parent" android: layout_height = "0dp" app: layout_constraintTop_toTopOf = "parent" app: layout_constraintBottom_toBottomOf = "parent">
@Vucko Спасибо, но это не помогает
Если бы вы могли быть немного более подробными, это помогло бы вам отсортировать этот
@Vucko, что именно вам нужно из кода?
Я не совсем понимаю, почему вы разместили свой код IndicatorViewPagerAdapter
.
Код вашего адаптера используется для данных заселять, он не имеет ничего общего с размером представления, которым является ViewPager
.
Для меня, вероятно, имеет смысл попробовать настроить окно просмотра и применить логику ручного изменения размера. Поэтому я искал это в stackoverflow, поскольку нашел популярный пост stackoverflow, где вы даже прокомментировали, но, похоже, вы также были смущены тем, как на самом деле его реализовать. Для ясности, я вообще не тестировал это, но, похоже, вас смутила разница между адаптеры и взгляды.
public class WrapContentHeightViewPager extends ViewPager {
public WrapContentHeightViewPager(Context context) {
super(context);
}
public WrapContentHeightViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = 0;
for(int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = child.getMeasuredHeight();
if (h > height) height = h;
}
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
Затем измените свой XML на
<TextView
android:id = "@+id/leftArrowTv"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_gravity = "center"
android:textColor = "@color/arrow_color"
android:textSize = "@dimen/_20ssp" />
<my.package.name.WrapContentHeightViewPager
android:id = "@+id/viewPager"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:fillViewport = "true" />
<TextView
android:id = "@+id/rightArrowTv"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_gravity = "center"
android:textColor = "@color/arrow_color"
android:textSize = "@dimen/_20ssp" />
</LinearLayout>
Когда я использую эту функцию в классе stackoverflow.com/a/20784791/11567530, она делает высоту viewPager равной наивысшему элементу, но я обнаружил проблему, если один из элементов ViewPager является изображением, высота viewPager становится большой из-за изображения, так как я могу решить эту проблему?
Ты еще там?
Я попробовал ваш код, и он работает с небольшими изменениями. Вам просто нужно проверить дизайн вашего элемента ViewPager. ViewPager отображается даже с высотой wrap_content. Посмотрите на приведенный ниже код:
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
View view = LayoutInflater.from(context).inflate(R.layout.feeds_item_layout,container, false);
...
container.addView(view);
return view;
}
когда я попробовал строчку layoutInflater, она не работает. Высота ViewPager примерно 10dp .. все виды в нем обрезаны
Ты проверил? Вы устанавливаете статическую высоту в LinearLayout, родительский элемент ViewPager - @ dimen / _150sdp
как я могу проверить дизайн моего ViewPager?
Кто-нибудь скажет мне, если мой вопрос не ясен