Я новичок в Android Studio и хочу, чтобы изображения можно было щелкнуть, чтобы я мог перейти к другому действию, где вы можете найти информацию об изображениях, на которые вы нажали. Как я могу это сделать? Любое решение?
Я думаю об использовании 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>
Какую информацию вы хотите передать?
Да что-то подобное. Если щелкнуть изображение, вы попадете в новое действие, где хранится информация об этом изображении (название места, местоположение, описание).
Было бы хорошо, если бы вы создали temp. кэш этого изображения и передать этот uri через Intent другому действию, не пытайтесь отправить полное растровое изображение, иначе есть вероятность OOM.
Я попытаюсь объяснить, как передавать данные, передавая позицию изображения из 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 в адаптере для передачи или запуска другого действия.
Большое спасибо, это работает, но моя проблема в том, что это приводит меня только к одному действию. Что, если я хочу, чтобы каждое изображение, по которому щелкнули, открывало действие для определенного изображения? Должен ли я сделать другую активность, а затем скопировать код и немного изменить его?
Если мой ответ помог решить вашу проблему, пожалуйста, нажмите на кнопку с галочкой, чтобы принять мой ответ.
Я не знаю, если это правильный способ, но вы можете создать новое действие только с помощью imageView
, а затем передать изображение, по которому щелкнули, этому действию.
Хорошо работает, спасибо за помощь. Я постараюсь найти способ решить другую проблему.
Вы хотите, чтобы то же изображение отображалось в следующем действии?