Подтвердить что ты не робот

Добавление нескольких изображений в ViewPager

Я новичок в программировании на Android. Я хотел бы сделать очень простое приложение, в котором вы можете просматривать несколько стандартных изображений в полноэкранном режиме. Я попробовал следующий учебник:

https://developer.android.com/training/animation/screen-slide.html#viewpager

Android немного сложнее для меня с файлами .xml для ресурсов и т.д. Я думал, что XML должен был просто определить отдельные ресурсы, но я понял, что они также действуют аналогично страницам HTML, когда я хочу создать представление. Мне удалось отобразить одно изображение, заменив второй TextView "textView" на мой ImageView в activity_screen_slide.xml.

Но проблема в том, что теперь он отображает одно и то же изображение с каждой страницы. Как я могу установить другую для каждой страницы? Я попытался добавить несколько LinearLayouts с разными изображениями, но приложение разбилось.

Любые идеи?

4b9b3361

Ответ 1

Чтобы показать другое изображение на каждом слайде, вам нужно добавить код, который определяет правильное изображение для каждой страницы. Поскольку вы просто пытаетесь отобразить несколько предопределенных изображений, я предполагаю, что вы уже загрузили изображения в свой проект, пригодный для рисования. Учитывая это предположение, я проведу вас через недостающие фрагменты в пример, который вы следуете.

Если вы еще этого не сделали, создайте свой класс ScreenSlidePageFragment и измените код, чтобы выглядеть примерно так:

public class ScreenSlidePageFragment extends Fragment {
private static final String ARG_RESOURCE_ID = "resource_id";
private int id; // resource id of the static image to display in this page

public ScreenSlidePageFragment() {
    // Required empty public constructor
}

// Your program should call this to create each instance of this Fragment.
public static ScreenSlidePageFragment newInstance(int id) {
    ScreenSlidePageFragment fragment = new ScreenSlidePageFragment();
    Bundle args = new Bundle();
    args.putInt(ARG_RESOURCE_ID, id);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        id = getArguments().getInt(ARG_RESOURCE_ID);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_screen_slide_page, container, false);
    // assign our image resource id here
    ImageView imageView = (ImageView) view.findViewById(R.id.image);
    imageView.setImageResource(id);
    return view;
}

Поскольку мы хотим, чтобы каждый фрагмент отображал изображение с другим идентификатором ресурса, я добавил параметр (id), который вы можете передать фрагменту при его создании.

Теперь нам нужно внести незначительные изменения в ScreenSlidePagerActivity. Во-первых, добавьте статический массив, содержащий ресурсы для рисования, которые вы хотите использовать. Он должен выглядеть примерно так:

private static final int[] IMAGES = {R.drawable.image1, R.drawable.image2, R.drawable.image3, R.drawable.image4};

Наконец, измените свой PagerAdapter, чтобы getCount возвращал размер вашего массива, а getItem просматривает соответствующий идентификатор ресурса для каждой страницы перед созданием каждого фрагмента слайда.

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
    public ScreenSlidePagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        if (position < IMAGES.length)
            return ScreenSlidePageFragment.newInstance(IMAGES[position]);
        else
            return null;
    }

    @Override
    public int getCount() {
        return IMAGES.length;
    }
}

Ответ 2

Вот как вы это делаете. Кроме того, убедитесь, что вы используете библиотеку загрузки изображений (например, Glide), чтобы избежать сбоев OutOfMemory при загрузке изображений.

    public class ImagesAdapter extends FragmentPagerAdapter {
    public ImagesAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return 6; //number of images you want to display
    }

    @Override
    public Fragment getItem(int position) {
        return ImageFragment.newInstance(position);
    }
   }

    public class ImageFragment extends Fragment {

    public static ImageFragment newInstance(int position){
       Bundle bundle = new Bundle();
       bundle.putInt("IMAGE_POSITION", position);
       ImageFragment fragment = new ImageFragment();
       fragment.setArguments(bundle);
       return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view =  inflater.inflate(R.layout.image_fragment_layout, container, false);
int option =           getArguments().getInt("IMAGE_POSITION");
        ImageView imageView = (ImageView)view.findViewById(R.id.imageView);
        TypedArray imgs = getResources().obtainTypedArray(R.array.images);
        Glide.with(this).load(imgs.getResourceId(SAUtils.getIndex(option) - 1, -1)).into(imageView);
        imgs.recycle();
        return view;


       }
        }

//in main activity
ViewPager pager = findViewById(R.id.viewpager);
ImagesAdapter adapter = new ImagesAdapter();
pager.setAdapter(adapter);


//in resources.xml    
<integer-array name="options_icons">
        <item>@drawable/image_1</item>
        <item>@drawable/image_2</item>
        <item>@drawable/image_3</item>
        <item>@drawable/image_4</item>
        <item>@drawable/image_5</item>
        <item>@drawable/image_6</item>
    </integer-array>

//image_fragment_layout
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitCenter" />
        </FrameLayout>


        //main_activity_layout
               <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/main_app_gradient"
            android:paddingBottom="56dp"
            android:visibility="visible" />

Ответ 3

Вам нужно адаптировать этот код

@Override
        public Fragment getItem(int position) {
            return new ScreenSlidePageFragment();
        }

Затем вы выбираете одно из ваших изображений в соответствии со значением "position"

И этот метод должен вернуть ваш счет изображения:

 @Override
        public int getCount() {
            return NUM_PAGES;
        }

Ответ 4

Если вы хотите добавить что-то вроде витринного представления или учебного/интро-представления для вашего приложения с отличным интерфейсом и анимацией, вы можете использовать библиотеки gradle для этой цели. Он также дает профессиональное прикосновение к приложению.

https://github.com/florent37/TutoShowcase
https://github.com/deano2390/MaterialShowcaseView
https://github.com/florent37/TutoShowcase

Ответ 5

Вы также можете использовать виджет Android под названием View Flipper для добавления динамических или статических изображений с помощью простых пользовательских анимаций. Прочтите эту ссылку для обзора:

https://developer.android.com/reference/android/widget/ViewFlipper.html