Щелкните слайдер изображений и перейдите к другому действию в Android Studio

  1. Я новичок в Android Studio и хочу, чтобы изображения можно было щелкнуть, чтобы я мог перейти к другому действию, где вы можете найти информацию об изображениях, на которые вы нажали. Как я могу это сделать? Любое решение?

  2. Я думаю об использовании onClickAttribute, но понятия не имею, как это сделать.

вот файл activity_main.xml

<androidx.viewpager2.widget.ViewPager2
    android:id = "@+id/viewPagerImageSlider"
    android:layout_width = "415dp"
    android:layout_height = "413dp"
    android:layout_marginStart = "8dp"
    android:layout_marginLeft = "8dp"
    android:layout_marginTop = "150dp"
    android:layout_marginEnd = "8dp"
    android:layout_marginRight = "8dp"
    android:layout_marginBottom = "168dp"
    android:paddingStart = "80dp"
    android:paddingEnd = "80dp"
    app:layout_constraintBottom_toBottomOf = "parent"
    app:layout_constraintEnd_toEndOf = "parent"
    app:layout_constraintStart_toStartOf = "parent"
    app:layout_constraintTop_toTopOf = "parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

здесь MainActivity.java

public class MainActivity extends AppCompatActivity {

private ViewPager2 viewPager2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    viewPager2 = findViewById(R.id.viewPagerImageSlider);

    List<SliderItem> sliderItems = new ArrayList<>();
    sliderItems.add(new SliderItem(R.drawable.image1));
    sliderItems.add(new SliderItem(R.drawable.image2));
    sliderItems.add(new SliderItem(R.drawable.image3));
    sliderItems.add(new SliderItem(R.drawable.image4));
    sliderItems.add(new SliderItem(R.drawable.image5));

    viewPager2.setAdapter(new SliderAdapter(sliderItems, viewPager2));

    viewPager2.setClipToPadding(false);
    viewPager2.setClipChildren(false);
    viewPager2.setOffscreenPageLimit(3);
    viewPager2.getChildAt(0).setOverScrollMode(RecyclerView.OVER_SCROLL_NEVER);

    CompositePageTransformer compositePageTransformer = new CompositePageTransformer();
    compositePageTransformer.addTransformer(new MarginPageTransformer(40));
    compositePageTransformer.addTransformer(new ViewPager2.PageTransformer() {
        @Override
        public void transformPage(@NonNull View page, float position) {
            float r = 1 - Math.abs(position);
            page.setScaleY(0.85f + r * 0.15f);
        }
    });

    viewPager2.setPageTransformer(compositePageTransformer);
}

}

вот SliderItem.java

public class SliderItem {
private int image;

SliderItem(int image) {
    this.image = image;
}

public int getImage() {
    return image;
}

}

вот SliderAdapter.java

public class SliderAdapter extends RecyclerView.Adapter<SliderAdapter.SliderViewHolder> {

private List<SliderItem> sliderItems;
private ViewPager2 viewPager2;

SliderAdapter(List<SliderItem> sliderItems, ViewPager2 viewPager2) {
    this.sliderItems = sliderItems;
    this.viewPager2 = viewPager2;
}

@NonNull
@Override
public SliderViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    return new SliderViewHolder(
            LayoutInflater.from(parent.getContext()).inflate(
                    R.layout.slide_item_container,
                    parent,
                    false
            )
    );
}

@Override
public void onBindViewHolder(@NonNull SliderViewHolder holder, int position) {
    holder.setImage(sliderItems.get(position));
    if (position == sliderItems.size() - 2) {
        viewPager2.post(runnable);
    }
}

@Override
public int getItemCount() {
    return sliderItems.size();
}

class SliderViewHolder extends RecyclerView.ViewHolder {
    private RoundedImageView imageView;

    SliderViewHolder(@NonNull View itemView) {
        super(itemView);
        imageView = itemView.findViewById(R.id.imageSlide);
    }

    void setImage(SliderItem sliderItem) {
        imageView.setImageResource(sliderItem.getImage());
    }
}

private Runnable runnable = new Runnable() {
    @Override
    public void run() {
        sliderItems.addAll(sliderItems);
        notifyDataSetChanged();
    }
};
}

вот файл slide_item_container.xml

<?xml version = "1.0" encoding = "utf-8"?>
<com.makeramen.roundedimageview.RoundedImageView 
xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
    android:id = "@+id/imageSlide"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:adjustViewBounds = "true"
    app:riv_corner_radius = "12dp">


</com.makeramen.roundedimageview.RoundedImageView>

Вы хотите, чтобы то же изображение отображалось в следующем действии?

Shoaib Kakal 13.12.2020 11:11

Какую информацию вы хотите передать?

Shoaib Kakal 13.12.2020 11:17

Да что-то подобное. Если щелкнуть изображение, вы попадете в новое действие, где хранится информация об этом изображении (название места, местоположение, описание).

Rey Kira 13.12.2020 12:19

Было бы хорошо, если бы вы создали temp. кэш этого изображения и передать этот uri через Intent другому действию, не пытайтесь отправить полное растровое изображение, иначе есть вероятность OOM.

Darshan 13.12.2020 14:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
1 150
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я попытаюсь объяснить, как передавать данные, передавая позицию изображения из MainActivity в DetailActivity.

Я использую следующий способ: сначала создайте интерфейс с именем метода onPictureClicked(), затем реализуйте этот интерфейс в своей MainActivity, чтобы переопределить onPictureClicked(). Вызовите этот метод в вашем адаптере. лайк: interface.onPictureClicked(int picturePositon)

Интерфейс.java

  public interface ClickedListener {
    
        void onPictureClicked(int position);
     
    }

SliderAdapter.java

public class SliderAdapter extends RecyclerView.Adapter<SliderAdapter.SliderViewHolder> {

private List<SliderItem> sliderItems;
private ViewPager2 viewPager2;
private ClickedListener clickedListener;

SliderAdapter(List<SliderItem> sliderItems, ViewPager2 viewPager2, ClickedListener clickedListener) {
    this.sliderItems = sliderItems;
    this.viewPager2 = viewPager2;
    this.clickedListener = clickedListener;
}

@NonNull
@Override
public SliderViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    return new SliderViewHolder(
            LayoutInflater.from(parent.getContext()).inflate(
                    R.layout.slide_item_container,
                    parent,
                    false
            )
    );
}

@Override
public void onBindViewHolder(@NonNull SliderViewHolder holder, int position) {
    holder.setImage(sliderItems.get(position));
    if (position == sliderItems.size() - 2) {
        viewPager2.post(runnable);
    }
}

@Override
public int getItemCount() {
    return sliderItems.size();
}

class SliderViewHolder extends RecyclerView.ViewHolder {
    private RoundedImageView imageView;

    SliderViewHolder(@NonNull View itemView) {
        super(itemView);
        imageView = itemView.findViewById(R.id.imageSlide);
    }

    void setImage(SliderItem sliderItem) {
        imageView.setImageResource(sliderItem.getImage());
        imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    clickedListener.onPictureClicked(getAdapterPosition);
                }
            });
    }
}

private Runnable runnable = new Runnable() {
    @Override
    public void run() {
        sliderItems.addAll(sliderItems);
        notifyDataSetChanged();
    }
};
}
public class MainActivity extends AppCompatActivity implements ClickedListener{

private ViewPager2 viewPager2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    viewPager2 = findViewById(R.id.viewPagerImageSlider);

    List<SliderItem> sliderItems = new ArrayList<>();
    sliderItems.add(new SliderItem(R.drawable.image1));
    sliderItems.add(new SliderItem(R.drawable.image2));
    sliderItems.add(new SliderItem(R.drawable.image3));
    sliderItems.add(new SliderItem(R.drawable.image4));
    sliderItems.add(new SliderItem(R.drawable.image5));

    viewPager2.setAdapter(new SliderAdapter(sliderItems, viewPager2, this));

    viewPager2.setClipToPadding(false);
    viewPager2.setClipChildren(false);
    viewPager2.setOffscreenPageLimit(3);
    viewPager2.getChildAt(0).setOverScrollMode(RecyclerView.OVER_SCROLL_NEVER);

    CompositePageTransformer compositePageTransformer = new CompositePageTransformer();
    compositePageTransformer.addTransformer(new MarginPageTransformer(40));
    compositePageTransformer.addTransformer(new ViewPager2.PageTransformer() {
        @Override
        public void transformPage(@NonNull View page, float position) {
            float r = 1 - Math.abs(position);
            page.setScaleY(0.85f + r * 0.15f);
        }
    });

    viewPager2.setPageTransformer(compositePageTransformer);
}

  //on image clicked this method will be triggered.
 @Override
    public void onPictureClicked(int position) {
        Intent intent = new Intent(getApplicationContext(), DetaildActivity.class);
        intent.putExtra("key",position);
        startActivity(intent);
    }
}

создание этого detailedActivity, чтобы получить намерение от MainActivity

public class MainActivity1 extends AppCompatActivity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mainpage);
       //the image position will be passed from the mainActivity to this DetailedActivity
        int getPosition = getIntent().getIntExtra("key", -1);
    }




}

Это была просто демонстрация через интерфейс того, как вы можете реализовать onClick в адаптере для передачи или запуска другого действия.

Большое спасибо, это работает, но моя проблема в том, что это приводит меня только к одному действию. Что, если я хочу, чтобы каждое изображение, по которому щелкнули, открывало действие для определенного изображения? Должен ли я сделать другую активность, а затем скопировать код и немного изменить его?

Rey Kira 14.12.2020 01:07

Если мой ответ помог решить вашу проблему, пожалуйста, нажмите на кнопку с галочкой, чтобы принять мой ответ.

Shoaib Kakal 14.12.2020 15:50

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

Shoaib Kakal 14.12.2020 15:51

Хорошо работает, спасибо за помощь. Я постараюсь найти способ решить другую проблему.

Rey Kira 15.12.2020 12:27

Другие вопросы по теме