当前位置: 首页 > 面试题库 >

如何使GridLayout适合屏幕大小

糜博远
2023-03-14
问题内容

GridLayoutAPI文档是非常难学......
有没有谁可以教我怎么一组孩子的任何一个Views到有类似的“权重”LinearLayout

现在看来,所有内容都放在了左侧,
我已经尝试了很多次,但仍然无法像每个屏幕一样将其变成屏幕宽度的一半。

编辑:我不知道当所有的小孩都可以做些什么wrap_content… …即使我想以特定的尺寸设置一些图像,此类也可以帮助我做ImageView wrap_content....它无法正常运行,我错过了一些设置吗?!?


问题答案:

注意:随着Android“ Lollipop”5的推出,水平线下方的信息不再准确,因为自API级别21起GridLayout 就适应了权重原则。

引用自Javadoc:

多余的空间分布

从API 21开始,GridLayout的剩余空间分布符合重量原则。如果未指定权重,则遵循先前的约定,并且如果列和行的视图在其组内指定某种形式的对齐方式,则将其视为灵活的。因此,视图的灵活性受其对齐方式的影响,对齐方式通常通过设置孩子的布局参数的重力属性来定义。如果沿给定的轴定义了重量或对齐方式,则该组件将在该方向上具有柔性。如果未设置权重或对齐方式,则假定该组件不灵活。

同一行或同一列组中的多个组件被视为并行运行。仅当其中的所有组件都是灵活的时,此类组才是灵活的。位于公共边界两侧的行和列组将被视为串联操作。如果这两个元素中的一个是柔性的,则由这两个元素组成的复合组是柔性的。

要拉伸列,请确保其中的所有组件都定义了重量或重力。为防止色谱柱拉伸,请确保色谱柱中的一个组件未定义重量或重力。

当灵活性原理不能完全消除歧义时,GridLayout的算法会偏向于更靠近其右边缘和下边缘的行和列。更精确地说,GridLayout将其每个布局参数都视为一组变量的约束,这些变量定义了沿给定轴的网格线。在布局期间,GridLayout求解约束,以便将唯一解返回到所有其他变量均小于或等于任何其他有效解中的对应值的约束。

还值得注意的是android.support.v7.widget.GridLayout包含相同的信息。不幸的是,它没有提到引入的支持库版本,但是添加功能的提交可以追溯到2014年7月。2014年11月,权重计算方面的改进和错误已修复。

为了安全起见,请确保导入最新版本的gridlayout-v7库。

正如您所描述的,“权重”原则并不存在GridLayout。该限制在文档中明确提到;摘录如下。话虽这么说,但仍有一些可能性将“重力”用于多余的空间分配。建议您通读链接文档。

局限性

GridLayout不支持按权重定义的权重原理。通常,因此,不可能将GridLayout配置为在多个行或列之间以不小的比例分配多余的空间。但是,可以按以下方式容纳一些常见用例。在单元组中的组件周围放置相等的空间;使用CENTER对齐方式(或重力)。完全控制行或列中多余空间的分配;使用LinearLayout子视图将组件保存在关联的单元格组中。使用这些技术中的任何一种时,请记住,单元格组可以定义为重叠。

有关示例和一些实用的指导,请查看去年的博客文章中介绍了GridLayoutwidget。

编辑:我不认为有一种基于xml的方法将Google Play应用中的图块缩放为“正方形”或“矩形”,其长度是这些正方形长度的两倍。但是,如果以编程方式构建布局,则肯定是可能的。要真正做到这两项,您真正需要知道的就是设备的屏幕尺寸。

在Google Play应用中平铺布局的快速(非常!)逼近之下。

Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
int screenWidth = size.x;
int screenHeight = size.y;
int halfScreenWidth = (int)(screenWidth *0.5);
int quarterScreenWidth = (int)(halfScreenWidth * 0.5);

Spec row1 = GridLayout.spec(0, 2);
Spec row2 = GridLayout.spec(2);
Spec row3 = GridLayout.spec(3);
Spec row4 = GridLayout.spec(4, 2);

Spec col0 = GridLayout.spec(0);
Spec col1 = GridLayout.spec(1); 
Spec colspan2 = GridLayout.spec(0, 2);

GridLayout gridLayout = new GridLayout(this);
gridLayout.setColumnCount(2);
gridLayout.setRowCount(15);

TextView twoByTwo1 = new TextView(this);
GridLayout.LayoutParams first = new GridLayout.LayoutParams(row1, colspan2);
first.width = screenWidth;
first.height = quarterScreenWidth * 2;
twoByTwo1.setLayoutParams(first);
twoByTwo1.setGravity(Gravity.CENTER);
twoByTwo1.setBackgroundColor(Color.RED);
twoByTwo1.setText("TOP");
twoByTwo1.setTextAppearance(this, android.R.style.TextAppearance_Large);
gridLayout.addView(twoByTwo1, first);

TextView twoByOne1 = new TextView(this);
GridLayout.LayoutParams second = new GridLayout.LayoutParams(row2, col0);
second.width = halfScreenWidth;
second.height = quarterScreenWidth;
twoByOne1.setLayoutParams(second);
twoByOne1.setBackgroundColor(Color.BLUE);
twoByOne1.setText("Staff Choices");
twoByOne1.setTextAppearance(this, android.R.style.TextAppearance_Large);
gridLayout.addView(twoByOne1, second);

TextView twoByOne2 = new TextView(this);
GridLayout.LayoutParams third = new GridLayout.LayoutParams(row2, col1);
third.width = halfScreenWidth;
third.height = quarterScreenWidth;
twoByOne2.setLayoutParams(third);
twoByOne2.setBackgroundColor(Color.GREEN);
twoByOne2.setText("Games");
twoByOne2.setTextAppearance(this, android.R.style.TextAppearance_Large);
gridLayout.addView(twoByOne2, third);

TextView twoByOne3 = new TextView(this);
GridLayout.LayoutParams fourth = new GridLayout.LayoutParams(row3, col0);
fourth.width = halfScreenWidth;
fourth.height = quarterScreenWidth;
twoByOne3.setLayoutParams(fourth);
twoByOne3.setBackgroundColor(Color.YELLOW);
twoByOne3.setText("Editor's Choices");
twoByOne3.setTextAppearance(this, android.R.style.TextAppearance_Large_Inverse);
gridLayout.addView(twoByOne3, fourth);

TextView twoByOne4 = new TextView(this);
GridLayout.LayoutParams fifth = new GridLayout.LayoutParams(row3, col1);
fifth.width = halfScreenWidth;
fifth.height = quarterScreenWidth;
twoByOne4.setLayoutParams(fifth);
twoByOne4.setBackgroundColor(Color.MAGENTA);
twoByOne4.setText("Something Else");
twoByOne4.setTextAppearance(this, android.R.style.TextAppearance_Large);
gridLayout.addView(twoByOne4, fifth);

TextView twoByTwo2 = new TextView(this);
GridLayout.LayoutParams sixth = new GridLayout.LayoutParams(row4, colspan2);
sixth.width = screenWidth;
sixth.height = quarterScreenWidth * 2;
twoByTwo2.setLayoutParams(sixth);
twoByTwo2.setGravity(Gravity.CENTER);
twoByTwo2.setBackgroundColor(Color.WHITE);
twoByTwo2.setText("BOTOM");
twoByTwo2.setTextAppearance(this, android.R.style.TextAppearance_Large_Inverse);
gridLayout.addView(twoByTwo2, sixth);


 类似资料:
  • 我正在使用android gif绘图库在我的android应用程序中显示gif图像。正如您所知,gif图像应该位于文件夹中,而不是位于文件夹中,因此android无法自动在不同大小之间切换。 我如何处理不同屏幕尺寸的问题?

  • 当我添加背景大尺寸位图类扩展SurfaceView,它不适合屏幕和一半消失: 公共类BackGound{ } 公共AapView(上下文上下文,Mainapp应用程序,intscreen_width,intscreen_height){超级(上下文); 如何使背景位图适合屏幕?

  • 问题内容: 我需要使我的网页高度适合屏幕尺寸的高度,而无需滚动。 HTML CSS 问题答案: 一个快速,简洁,有效的独立解决方案,带有内联CSS,无jQuery要求。AFAIK也可以从IE9使用。

  • 大家好 我在react native中遇到了CSS问题,我想在没有ScrollView的情况下在屏幕中安装所有组件,但我似乎无法找出问题所在(我尝试更改边距或填充的值,但在每个设备中看起来都不一样) 正如你所看到的附加图像: 正如你所看到的,下面的图表不在屏幕上,我需要滚动查看图表(我不想要) 以下是css代码:(我删除了一些行以缩短代码(如旋转木马组件等) ); CSS:

  • 我正在尝试使用图像创建。网格有3列。 但我有一些问题: 正在离开屏幕,如下图所示。未正确设置s的宽度以适应。 这是我当前的代码。我应该改变什么来解决我的两个问题? 根据这个答案,我尝试使用以下布局: 但它看起来像下图。每个图像视图占据整个屏幕的宽度: http://i.imgur.com/p8AXcKN.png

  • 我有麻烦了!我有这个RecyclerView,其中我使用GridLayoutManager来实现两列和几行。但我的问题来了:我在这个RecyclerView中最多有8个项目,我想根据屏幕大小来调整它们 到目前为止,我得到了这个: 使用这段代码: 和在我的 上的选项项适配器构造函数中: 你有什么想法可以让我做到这一点吗?提前致谢。