如何在gridview中根据屏幕尺寸设置图像宽度高度

2024-05-26

我想显示 3x3 大小的网格视图。我想根据设备尺寸设置高度和宽度。我正在参考这个链接 http://www.tutorialspoint.com/android/android_grid_view.htm.

主要活动-

public class MainActivity extends Activity {

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

      GridView gridview = (GridView) findViewById(R.id.gridview);
      gridview.setAdapter(new ImageAdapter(this));
   }

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
   }

}

活动_主要-

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
   android:id="@+id/gridview"
   android:layout_width="fill_parent" 
   android:layout_height="fill_parent"
   android:columnWidth="90dp"
   android:numColumns="auto_fit"
   android:verticalSpacing="10dp"
   android:horizontalSpacing="10dp"
   android:stretchMode="columnWidth"
   android:gravity="center"
/>

Edit-

就像首先获取屏幕高度和宽度,然后每个项目的高度和宽度是我获取的屏幕高度和宽度值的 1/3。


不使用屏幕尺寸,在多窗口上下文中,此方法是invalid。 如果您的网格是固定的 3x3 项目大小,那么请使用自定义布局 ViewGroup,如下所示:(并设置RelativeLayout项目内容)

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle state) {
        setContentView(new ViewGroup(this) {
            private RelativeLayout[] items = new RelativeLayout[9];
            private int width, height, itemWidth, itemHeight;
            {
                Random r = new Random();
                for (int i = 0; i < 9; i++) {
                    items[i] = new RelativeLayout(getContext());
                    float[] hsv = new float[] {360 * r.nextFloat(), .50f, .75f};
                    items[i].setBackgroundColor(Color.HSVToColor(hsv));
                    addView(items[i]);

                    // UPDATE ////////////////////////////////////
                    ImageView image = new ImageView(getContext());
                    switch (i) {
                    case 0: // top left
                    case 1: // top center
                    case 2: // top right
                    case 3: // center left
                    case 4: // center center
                    case 5: // center right
                    case 6: // bottom left
                    case 7: // bottom center
                    case 8: // bottom right
                        image.setImageResource(R.drawable.ic_launcher);
                        break;
                    }
                    image.setScaleType(ScaleType.FIT_XY);
                    image.setLayoutParams(new RelativeLayout.LayoutParams(
                            RelativeLayout.LayoutParams.MATCH_PARENT,
                            RelativeLayout.LayoutParams.MATCH_PARENT
                    ));
                    items[i].addView(image);
                    //////////////////////////////////////////////
                }
            }
            @Override
            protected void onMeasure(int wMS, int hMS) {
                width = MeasureSpec.getSize(wMS);
                height = MeasureSpec.getSize(hMS);
                itemWidth = width / 3;
                itemHeight = height / 3;
                wMS = MeasureSpec.makeMeasureSpec(itemWidth, MeasureSpec.EXACTLY);
                hMS = MeasureSpec.makeMeasureSpec(itemHeight, MeasureSpec.EXACTLY);
                measureChildren(wMS, hMS);
                setMeasuredDimension(width, height);
            }
            @Override
            protected void onLayout(boolean changed, int l, int t, int r, int b) {
                for (int i = 0; i < 9; i++) {
                    l = itemWidth * (i % 3);
                    t = itemHeight * (i / 3);
                    r = l + itemWidth;
                    b = t + itemHeight;
                    items[i].layout(l, t, r, b);
                }
            }
        });
        super.onCreate(state);
    }

}

EDIT:请参阅我的代码更新,您只需将图像添加到项目容器中即可。使用此方法,不需要 XML 布局文件,因为您可以自行管理内容和大小。

Result : result


EDIT:极简方式:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle state) {
        setContentView(new ViewGroup(this) {
            private static final int SIZE_X = 3;
            private static final int SIZE_Y = 3;
            private ImageView[] items = new ImageView[SIZE_X * SIZE_Y];
            private int itemWidth, itemHeight;
            {
                setBackgroundColor(Color.DKGRAY);
                for (int i = 0; i < items.length; i++) {
                    items[i] = new ImageView(getContext());
                    items[i].setScaleType(ScaleType.CENTER);
                    items[i].setImageResource(R.drawable.ic_launcher);
                    addView(items[i]);
                }
            }
            @Override
            protected void onMeasure(int wMS, int hMS) {
                int width = MeasureSpec.getSize(wMS);
                int height = MeasureSpec.getSize(hMS);
                itemWidth = width / SIZE_X;
                itemHeight = height / SIZE_Y;
                wMS = MeasureSpec.makeMeasureSpec(itemWidth, MeasureSpec.EXACTLY);
                hMS = MeasureSpec.makeMeasureSpec(itemHeight, MeasureSpec.EXACTLY);
                measureChildren(wMS, hMS);
                setMeasuredDimension(width, height);
            }
            @Override
            protected void onLayout(boolean changed, int l, int t, int r, int b) {
                for (int i = 0; i < items.length; i++) {
                    l = itemWidth * (i % SIZE_X);
                    t = itemHeight * (i / SIZE_X);
                    r = l + itemWidth;
                    b = t + itemHeight;
                    items[i].layout(l, t, r, b);
                }
            }
        });
        super.onCreate(state);
    }

}

Result :


@坎瓦尔吉特·辛格:

在 MainActivity 项目创建循环中:

final int id = i;
items[i].setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        startActivity(new Intent(getContext(), NextActivity.class).putExtra("id", id));
    }
});

在下一个活动中:

int id = getIntent().getIntExtra("id", -1);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在gridview中根据屏幕尺寸设置图像宽度高度 的相关文章

  • 如何快速自动发送FCM或APNS消息?

    我正在开发一项后端服务 通过 FCM 或 APNS 向移动应用程序发送推送通知 我想创建一个可以在一分钟内运行的自动化测试 并验证服务器是否可以成功发送通知 请注意 我不一定需要检查通知是否已送达 只需检查 FCM 或 APNS 是否已成功
  • Android Studio 3.0 Canary 9 - 无法解析包

    我在 Android Studio 3 0 Canary 9 中遇到几个错误 这些错误是 无法解析 android 软件包 下面列出了一些错误 我刚刚安装了 SDK 的所有额外软件包 但仍然收到 gradle 构建错误 Error 82 1
  • 类型容器“Android 依赖项”引用不存在的库 android-support-v7-appcompat/bin/android-support-v7-appcompat.jar

    我在尝试在我的项目中使用 Action Bar Compat 支持库时遇到了某种错误 我不知道出了什么问题 因为我已按照此链接中的说明进行操作 gt http developer android com tools support libr
  • 在包“android”中找不到属性“backgroundTint”的资源标识符

    我发现了一些视图 xml 属性 例如backgroundTint backgroundTintMode 但是当我使用它作为视图属性定义时 Eclipse 显示错误 No resource identifier found for attri
  • CardView 圆角获得意想不到的白色

    When using rounded corner in CardView shows a white border in rounded area which is mostly visible in dark environment F
  • 谷歌坐标认证

    当我尝试连接到 Google 坐标时 总是出现异常GoogleAuthException 我拥有 Google 地图协调中心许可证 我确实使用我的包应用程序名称和 SHA1 在 google 控制台中创建了我的客户端 ID 我将权限添加到清
  • Adobe 是否为其 PDF 阅读器提供 Android SDK 或 API? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望能够在我们的应用程序内的视图中显示本地 PDF 文件 在 Android 4 03 下的平板电脑上运行 目前 我们将 Adob eR
  • Android 中 Kotlin 协程的正确使用方式

    我正在尝试使用异步更新适配器内的列表 我可以看到有太多的样板 这是使用 Kotlin 协程的正确方法吗 这个可以进一步优化吗 fun loadListOfMediaInAsync async CommonPool try Long runn
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 获取当前 android.intent.category.LAUNCHER 活动的实例

    我创建了一个库项目 并在多个应用程序之间共享 我实现了一个简单的会话过期功能 该功能将在一段时间后将用户踢回到登录屏幕 登录屏幕活动是我的主要活动 因此在清单中它看起来像这样
  • 你的CPU不支持NX

    我刚刚下载了 android studio 但是我遇到了一个问题 当我运行它时 它说你的 cpu 不支持 NX 我应该怎么办 NX 或实际上是 NX 处理器位 是处理器的一项功能 有助于保护您的 PC 免受恶意软件的攻击 当此功能未启用并且
  • Ubuntu 16.04 - Genymotion:找不到 /dev/hw_random

    I install Genymotion on the Ubuntu 16 04 64Bit I created a virtual emulator for Android 6 0 then I run this emulator but
  • 在 android DatePickerDialog 中将语言设置为法语

    有什么办法可以让日期显示在DatePickerDialog用法语 我已经搜索过这个但没有找到结果 这是我的代码 Calendar c Calendar getInstance picker new DatePickerDialog Paym
  • 错误:在根项目“projectName”中找不到项目“app”

    我有一个在 Eclipse 中开发的旧应用程序 现在尝试将其迁移到 Android Studio 我更新了库并遵循了基本步骤 现在 我收到此错误 Error Project app not found in root project pro
  • 我的设备突然没有显示在“Android 设备选择器”中

    我正在使用我的三星 Galaxy3 设备来测试过去两个月的应用程序 它运行良好 但从今天早上开始 当我将设备连接到系统时 它突然没有显示在 Android 设备选择器 窗口中 我检查过 USB 调试模式仅在我的设备中处于选中状态 谁能猜出问
  • 增加活动的屏幕亮度

    显然 Android 操作系统中至少有三种不同的技术可以改变屏幕亮度 其中两个在纸杯蛋糕之后不再起作用 而第三个被接受的技术显然有一个错误 我想在单视图活动开始时增加屏幕亮度 然后在活动结束时将亮度恢复为用户设置 没有按钮 没有第二个视图或
  • 一次显示两条Toast消息?

    我希望在一个位置显示一条 Toast 消息 并在另一位置同时显示另一条 Toast 消息 多个 Toast 消息似乎总是按顺序排队和显示 是否可以同时显示两条消息 是否有一种解决方法至少可以提供这种外观并且不涉及扰乱活动布局 Edit 看来
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分

随机推荐

  • 设备锁定时扫描外围设备

    我的中央管理器可以在前台和后台检测新的外围设备 我知道这一点是因为当它发现新的外围设备时我会触发 UNNotification 但是 当设备锁定时 它似乎不会继续扫描新的外围设备 在我的能力范围内 我启用了使用 LE 配件的后台模式以及远程
  • 使用管道将文件夹从 Bitbucket 存储库推送到公共服务器

    我在 Bitbucket 存储库中启用了管道 并且需要在每次构建后在我的服务器中运行 Angular 2 构建并部署 dist 文件夹 在执行构建命令后创建 我的 bitbucket pipelines yml 文件中有以下内容 image
  • 简单的 svg css 进度圈

    我正在尝试寻找一种方法来实现没有动画的简单进度圈 静态 我发现的示例具有非常不同的百分比偏移量 如下例所示 如何以这样的方式制作进度圈 如果我提供偏移量为 50 那么它恰好是 50 半填充 u absoluteCenter position
  • 设计涟漪

    我正在尝试使用以 riak 作为数据库的设备创建身份验证 我找到了同样的 ORM 策略https github com frank06 devise ripple https github com frank06 devise ripple
  • Nginx 和 Flask-socketio Websockets:存在但没有消息传递?

    我在让 Nginx 与 Python Flask socketio 库 基于 gevent 很好地配合时遇到了一些麻烦 目前 由于我们正在积极开发 我正在尝试让 Nginx 充当代理 对于发送页面 我可以通过直接运行flask socket
  • .NET 的符号数学

    我正在寻找 NET 框架的符号数学库 我看过Math net 但它还不是可用的 您知道是否还有其他图书馆存在吗 这可能有点过分了 但你可以和数学 http www wolfram com products mathematica index
  • 根据值从绿色到红色[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要一个在 vb net 中返回从红色 值 0 到绿色 值 100 的颜色的函数 另外 我需要一种方法来确定字体的颜色应该是白色还是
  • Git 将开发分支与生产版本的主分支合并

    我正在使用 Git 进行代码版本控制 我有一个开发分支 我正在其中进行所有肮脏的开发 每次我向世界发布生产版本时 我都想将其放在我的 master 分支下 问题是 每当我合并开发和 master 时 master 都会收到所有开发历史记录
  • 使用 Elixir 生成首字母头像 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在开发 Elixir 并希望提供头像服务 如果用户没有头像 可以制作一个带有他们姓名首字母缩写的头像 如下所示 我真的不知道从哪里
  • NHibernate HQL 相当于 T-SQL 的 TOP 关键字

    NHibernate HQL 相当于 T SQL 的 TOP 关键字是什么 另外 用非 HQL 方式说 给我一门课的前 15 个 是什么意思 在 HQL 中这实际上非常简单 var top15 session CreateQuery fro
  • 重置 PK 自动增量列

    我已经多次导入数千条记录 以确保导入完美运行 结果 现在当我在发布前进行实时导入时 自动增量列的 ID 列约为 300 000 一旦我删除了这些表中的所有数据 是否有任何简单的方法可以 重置 此设置 我只想出于 SEO 的原因 URL Fo
  • 用 C 重写我用 C++ 编写的通用函数的最佳方法是什么?

    Prints out a given array template
  • 多个 BrowserRouter 显示多个组件

    我想用basename来分离组件 我也有全局 url 所以我最终使用了 3 个BrowserRouters 这会导致显示多个内容 如果我去 fruit search 它会显示以下内容Homepage组件和FruitSearch成分 我究竟如
  • Laravel - 获取每个 UID 类型的最后一个条目

    我有一个表 其中包含 1000 多种不同产品的 100 个条目 每个条目都由唯一的 UID 标识 ID UID MANY COLUMNS CREATED AT 1 dqwdwnboofrzrqww1 2018 02 11 23 00 43
  • 如何确定代码是否在信号处理程序上下文中运行?

    我刚刚发现有人正在从信号处理程序调用我编写的绝对不是异步信号安全的函数 所以 现在我很好奇 如何避免这种情况再次发生 我希望能够轻松确定我的代码是否在信号处理程序上下文中运行 语言是 C 但该解决方案不适用于任何语言吗 int myfunc
  • iOS-如何使用 AVAsset 或 AVURLAsset 获取 .mp4 文件的持续时间

    我知道视频类型问题的持续时间之前已得到解答 但我在获取视频持续时间方面遇到了真正的麻烦 mp4文件通过使用AVAsset and by AVURLAsset 我正在使用以下代码 NSString itemPathString NSSearc
  • 确定自上次访问 SQL Server 以来的行更改

    我们有一个多用户系统 用户将数据保存到中央 SQL Server 2005 数据库中 我们遇到了一个问题 即一个用户刷新数据库中的更改 而另一个用户保存新数据 我们当前收集更改的方式是每个表上都有一个时间戳列 该列在每行插入 更新时都会填充
  • 匿名监听器与弱引用不兼容吗?

    我正在阅读刚刚被问到的这个问题 避免回调中的内存泄漏 https stackoverflow com questions 8475314 我很困惑 直到有人回答了以下问题 这种方法的问题是你不能拥有一个仅在集合中引用的侦听器 因为它会随机消
  • 更改作为战争部署的 spring-boot 应用程序的默认欢迎页面

    我试图找到一种方法来更改在生产中作为战争部署的 spring boot 应用程序的默认欢迎页面 但如果没有 web xml 文件 我找不到方法来做到这一点 根据文档 我们可以使用 EmbeddedServletContainerFactor
  • 如何在gridview中根据屏幕尺寸设置图像宽度高度

    我想显示 3x3 大小的网格视图 我想根据设备尺寸设置高度和宽度 我正在参考这个链接 http www tutorialspoint com android android grid view htm 主要活动 public class M