如何定位动态添加的 ImageView,以便它们在网格上限制为连续 3 个?



我正在创建一个应用程序,其中一个功能是允许其用户在提交之前拍照并作为缩略图查看。我已经设法让相机拉起,拍照,然后在线性布局中显示照片。我遇到的问题是我无法让它们很好地定位,我希望它们在一个网格中,该网格只允许并排 3 张图像,它们将从中移动到新行。

这是我的班级:

package com.example.dentdevils.ui.HomeLinks;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.example.dentdevils.R;
public class AddPhotosActivity extends AppCompatActivity {
private static final int CAMERA_REQUEST = 1888;
private static final int MY_CAMERA_PERMISSION_CODE = 100;
private LinearLayout linearLayout;
ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_photos);
this.linearLayout = (LinearLayout) findViewById(R.id.linearPhoto);
Button takePhoto = (Button) findViewById(R.id.btnTakePhoto);
takePhoto.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onClick(View v) {
for (int j = 0; j < 1; j++) {
Intent cameraIntent = new Intent (MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
imageView = new ImageView(AddPhotosActivity.this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1);
imageView.setLayoutParams(params);
linearLayout.addView(imageView);
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MY_CAMERA_PERMISSION_CODE)
{
if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
{
Toast.makeText(this, "Camera permission granted!", Toast.LENGTH_LONG).show();
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
}
else
{
Toast.makeText(this, "Camera permission denied. The app must have permissions to use your camera.", Toast.LENGTH_LONG).show();
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(photo);
}
}
}

目前图像是这样展开的(因为添加了权重参数(: https://i.stack.imgur.com/SqQV5.jpg

在创建新的 LinearLayout 来保存接下来的 3 张图像之前,如何将图像数量限制为 3 张?谢谢

您可以使用 GridLayout Manager 创建回收器视图并将范围设置为 3

在 XML 中,

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/photo_recycler_view"
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"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="3"/>

除此之外,您还必须创建每个项目的布局和一个适配器来填充回收器视图

回收器中每个项目的简单布局视图,

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/photo_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
android:adjustViewBounds="true" />
</LinearLayout>

要设置图像,请列出要显示的图像并将其传递给回收器视图的适配器,它将用图像填充回收器视图。

回收商查看文档:https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView

最新更新