首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >适合屏幕的GridLayout自动大小项

适合屏幕的GridLayout自动大小项
EN

Stack Overflow用户
提问于 2019-11-28 16:27:22
回答 1查看 434关注 0票数 0

我正在尝试制作一个自定义日历控件来填充屏幕。日历为7天乘6周(静态)。我正在使用一个GridLayout (android.support.V7.widget.GridLayout)来规划屏幕上的日子。

网格的内容将使用单独的布局文件加载。

然而,网格中项目的布局似乎都位于左上角。LayoutGrid是父级的大小,但项目都尽可能小(即使对项进行编码调整)。

我期待得到的布局,以填补整个屏幕。我知道我可以用嵌套的LinearLayout布局来完成这个任务,但这违背了GridLayout的目的。

任何帮助都将不胜感激。

日中的列表视图也会导致意外的布局,每一天都是屏幕的全部宽度。

GridLayout布局

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#0FC"
    android:paddingTop="?attr/actionBarSize">
  <android.support.v7.widget.GridLayout
    android:id="@+id/grdlayCalendarMonth"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FC0"

    app:alignmentMode="alignBounds"
    app:columnCount="7"
    app:rowCount="6"
    app:useDefaultMargins="true"
  />
</LinearLayout>

日布局

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="250dp"
    android:layout_height="250dp"
    android:background="#4444ff"
    app:layout_columnWeight="1"
    app:layout_rowWeight="1"
    app:layout_gravity="fill_vertical">
  <android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:cardCornerRadius="3dp"
    app:cardElevation="3dp"
    app:cardUseCompatPadding="true"
    android:layout_margin="0dp"
    android:paddingVertical="3dp"
    app:cardBackgroundColor="@color/cardTextGreen">

    <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical"
      android:id="@+id/layoutCalendarDay"
      android:background="#fc03e8">
      <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/lblCalendarDayDate"/>
      <!--<ListView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/lvwCalendarDay"/>-->
    </LinearLayout>

  </android.support.v7.widget.CardView>
</LinearLayout>

向GridLayout添加日期

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 Android.Support.V7.Widget.GridLayout monthGrid = FindViewById<Android.Support.V7.Widget.GridLayout>(Resource.Id.grdlayCalendarMonth);

            //Find the first day of the month.
            DateTime firstDayOfMonth = DateTime.Now.GetFirstDayOfMonth();
            DayOfWeek firstDayOfWeek = firstDayOfMonth.DayOfWeek;
            DateTime firstDayOfDisplayCalendar = firstDayOfMonth.AddDays(-(int)firstDayOfWeek);

            for (int r = 0; r < 6; r++) //ROW
            {
                for (int c = 0; c < 7; c++) //COLUMN
                {    
                    Android.Support.V7.Widget.GridLayout.LayoutParams param = new Android.Support.V7.Widget.GridLayout.LayoutParams(
                        Android.Support.V7.Widget.GridLayout.InvokeSpec(r, 1), Android.Support.V7.Widget.GridLayout.InvokeSpec(c, 1));

                    View dayView = View.Inflate(this, Resource.Layout.calendar_month_dayview, null);
                    dayView.LayoutParameters = param;
                    TextView dayListDate = dayView.FindViewById<TextView>(Resource.Id.lblCalendarDayDate);
                    dayView.Tag = firstDayOfDisplayCalendar.Ticks;
                    dayListDate.Text = firstDayOfDisplayCalendar.ToString("dd").Ordinalize();                      
                    firstDayOfDisplayCalendar = firstDayOfDisplayCalendar.AddDays(1);  
                    monthGrid.AddView(dayView, param);
                }
            }

更新:,而下面的答案是做它所显示的。当任何额外的控件被添加到网格日布局中时,列和行的缩放就会发生变化,这一切又一次失去了同步。为了节省时间,我将使用嵌套的LinearLayout结构。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-28 19:10:46

根据您的描述,您希望拆分GridLayout项的屏幕行高度和列宽,如果是,可以查看以下代码以修改代码。

您可以使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GridLayout.InvokeSpec(r, GridLayout.Fill, 1f)

到现有平均可用空间:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 for (int r=0;r<5;r++)
        {
            for(int c=0;c<7;c++)
            {
                var row = GridLayout.InvokeSpec(r, GridLayout.Fill, 1f);
                var col = GridLayout.InvokeSpec(c, GridLayout.Fill,1f);
                View layout1 = View.Inflate(this, Resource.Layout.layout1, null);
                TextView textview = layout1.FindViewById<TextView>(Resource.Id.textView1);
                textview.Text = "test!";
                layout1.LayoutParameters = new GridLayout.LayoutParams(row, col);

                monthGrid.AddView(layout1);
            }
        }

结果:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59097480

复制
相关文章
你真的理解内存分配吗?
内存是计算机中必不可少的资源,因为 CPU 只能直接读取内存中的数据,所以当 CPU 需要读取外部设备(如硬盘)的数据时,必须先把数据加载到内存中。
用户7686797
2021/04/25
1.2K0
你真的理解内存分配吗?
Java 对象都是在堆上分配内存吗?
来源:LittleMagic jianshu.com/p/8377e09971b8
用户1516716
2019/12/10
1K0
Java 对象都是在堆上分配内存吗?
ThreadLocal真的会造成内存泄漏吗?
ThreadLoca在并发场景中,应用非常多。前几天有位小伙伴问我一个问题,说ThreadLocal是不是真的会造成内存泄漏?今天给大家做一个分享,个人见解,仅供参考。如果大家有其他见解可以在评论区讨论。
Tom弹架构
2022/08/22
6280
ThreadLocal真的会造成内存泄漏吗?
Zephyr 内存分配
int k_mem_pool_alloc(struct k_mem_pool *p, struct k_mem_block *block, size_t size, s32_t timeout)
无限之生
2020/07/01
1.7K0
Netty内存分配
Netty 中的内存管理的实现并不是一蹴而就的,它也是参考了 Jemalloc 内存分配器。而 Jemalloc 又借鉴了 Tcmalloc(出身于 Google,通过红黑树来管理内存快和分页,带有线程缓存。对于小的对象来说,直接由线程的局部缓存来完成,大对象那就由自旋锁来减少多线程下的竞争)的设计思路,但是 Jemalloc 设计的更复杂,虽然也有线程缓存的特性,但是 Jemalloc 将内存分配的粒度划分为 Small、Large、Huge 三个分类,在空间的占用上比较多,但是在大内存分配的场景,内存碎片就略少 。
政采云前端团队
2023/09/14
5340
Netty内存分配
java内存分配
转自:http://www.iteye.com/topic/634530 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对象可能在常量池里)(字符串常量对象存放在常量池中。) 3. 堆:存放所有new出来的对象。 4. 静态域:存放静态成员(static定义的) 5. 常量池:存放字符串常量和基本类型常量(public static final)。有时,在嵌入式系统中,常量本身会和其他部分分割离开(由于版权等其他原因),所以在这种情况下,可以选择将其放在ROM中 。 6. 非RAM存储:硬盘等永久存储空间 这里我们主要关心栈,堆和常量池,对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。 对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。 如以下代码:
qubianzhong
2019/06/26
2.1K0
java内存分配
JSCH会大量使用服务器内存吗?会 原
java实现一个需求用到了jsch,发现服务器内存会被占满。 写了个50进程的jsch-sftp测试连接 put一个文件
stys35
2019/03/05
5.4K0
C语言动态内存分配:按需分配内存。
1.void *malloc(int size); 2.void free(void *p); 例:建立动态数组,输入5个学生的成绩,输出不及格学生的成绩。 #include<stdlib.h> int main(){ void check(float *p); float *p=(float*)malloc(5*sizeof(float)); for(int i=0;i<=4;i++){ scanf("%f",p+i); } check(p); free(p); return 0; } void chec
岳泽以
2022/10/26
1.5K0
连续内存分配
连续内存是一种比较直观的做法。这种做法将内存分为两个区域,一个是用户进程区域,另一个是操作系统区域。操作系统一般放在内存的低地址区域,这时因为中断向量被设置在低地址,例如0x80中断。为了提高响应速度,内存之中需要驻留多个进程来实现这一性能改进。现在就需要考虑内存分配。
zy010101
2019/07/10
1.8K0
Go 内存管理 -- 内存分配 二
首先会申请一段连续的内存空间以供使用,大小(64位机器上)512M(spans_mapped)+16G(bitmap_mapped)+512G(arena)。 hmap初始化的源码在src/runtime/proc.go中,大家可以参照本文看一下。 mheap初始化
邹志全
2019/07/31
1.7K0
Java内存管理(一、内存分配)
关于Java内存分配,很多问题都模模糊糊,不能全面贯通理解。今查阅资料,欲求深入挖掘,彻底理清java内存分配脉络,只因水平有限,没达到预期效果,仅以此文对所研究到之处作以记录,为以后学习提供参考,避免重头再来。
bear_fish
2018/09/20
3.5K0
数组大小分配(动态内存分配)
在很多情况下,我们无法确定要使用多大的数组。一般申请大于估计数目的固定大小,这样程序在运行时就申请了固定的大小,你觉得数组定义足够大,但是如果某种原因,数组的个数增大或减小,你又必须重新修改程序,扩大数组的存储范围。这种分配固定大小内存分配的方法称为静态内存分配。但是这种分配方法存在比较严重的缺陷,特别是处理某些问题时,在大多数情况下会浪费大量的内存空间;在少数情况下,当申请的数组不够大时,可能引起下标越界错误,甚至导致严重的后果。 为了解决这个问题,提出了动态内存分配。所谓动态内存分配是指在程序执行的过程中动态地分配或者回收存储空间的内存分配方法。动态分配不像数组等静态内存分配方法需要预先申请内存空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。从以上动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点:
海盗船长
2020/08/27
2.6K0
Memcache内存分配策略
转自:http://tank.blogs.tkiicpp.com/2010/12/14/memcache%e5%86%85%e5%ad%98%e5%88%86%e9%85%8d%e7%ad%96%e7%95%a5/
Java架构师必看
2021/03/22
1.4K0
Go 内存管理 -- 内存分配 一
go作为一个比较新晚(新)的语言,自然借鉴前辈们的优点,比如说语言本身负责内存管理、对协程和高并发的高优支持、简单高效的语法等。本篇及后续的几篇要讲的就是还没提到的比较复杂的内存管理。 学习内存管理(分配&回收)前,如果有JVM的内存管理的基础,会变得非常简单,如果是第一次接触内存管理,在看完Go的内存管理后可以去看看JVM的,对比着学习比较容易理解。 go的内存管理思路是基于google 的tcmalloc(thread-caching-malloc)实现的,常见的内存分配器还有ptmalloc、jemalloc,但是tcmalloc的性能更高,尤其是高并发场景下。
邹志全
2019/07/31
1.4K0
探寻iOS内存分配
iOS中主要是栈区(stack)、堆区(heap)、全局区/静态区(staic) ;
sweet说好的幸福
2020/12/23
1.3K0
探寻iOS内存分配
【Linux 内核 内存管理】伙伴分配器 ② ( 伙伴分配器分配内存流程 )
页 / 阶 概念参考 【Linux 内核 内存管理】伙伴分配器 ① ( 伙伴分配器引入 | 页块、阶 | 伙伴 ) 博客 ;
韩曙亮
2023/03/30
7.1K0
图解golang内存分配
我们知道所有程序运行都需要使用内存,而内存的管理和分配又是非常重要的,它决定了你的程序能不能在有限的资源内跑的更快。可以设想一下,如果你自己来设计的一个内存分配的规则,会遇到什么问题呢?如果你有了一大块内存你要怎么去合理的分配和使用呢?今天我们通过几张图来看看golang中的内存分配是怎样的。
LinkinStar
2022/09/01
1.1K0
图解golang内存分配
Netty Unpooled 内存分配
Netty里的内存管理是通过ByteBuf这个类作为桥梁连接着业务代码与jdk底层的内存。所以理解ByteBuf的结构就很有必要了。
良辰美景TT
2018/12/25
1.8K0
Java_内存分配
new出的空间都是作为动态内存在堆中分配的,比如new出的对象的成员属性、使用new开辟的数组中的各个元素、使用new创建的基本数据类型等
用户10551528
2023/05/09
4990
Java_内存分配
JVM内存模型及内存分配过程
一、JVM内存模型 JVM主要管理两种类型内存:堆(Heap)和非堆(Permanent区域)。 1、Heap是运行时数据区域,所有类实例和数组的内存均从此处分配。Heap区分两大块,一块是 Young Generation,另一块是Old Generation: 1)在Young Generation中,有一个叫Eden Space的空间,主要是用来存放新生的对象,还有两个Survivor Spaces(from,to),它们的大小总是一样,它们用来存放每次垃圾回收后存活下来的对象。 2)在Old Gen
Java架构师历程
2018/09/26
3.2K0

相似问题

专用的内存分配功能会导致内存泄漏吗?

61

C会自动为我分配内存吗?

812

cvrelease会删除已分配的内存吗?

20

kmalloc()分配的内存会自动释放吗?

27

Python:数组创建会自动分配内存吗?

012
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文