确定主屏幕的应用小部件空间网格大小。

3
我已经为平板电脑开发了一个可调整大小的应用程序小部件。该应用程序小部件在大多数设备上与大多数启动器都很好地工作,但是在GO-HD Launcher中的纵向模式下存在一些方向问题。应用程序小部件的高度太大,看起来不好看。
为了解决这个问题,我创建了一种方法,允许用户设置任何额外的边距,在应用程序小部件空间中,以使其看起来更漂亮。例如,当设备处于纵向模式时,他可以设置额外的20像素顶部边距,而在横向模式下仅设置5像素等。
现在我正在创建一个活动,允许用户设置边距。我想要创建一个小的预览区域(它将是一个具有相同背景可绘制应用程序小部件的线性布局),以便用户可以了解带有这些边距的应用程序小部件在主屏幕上的外观。实际上,我已经做到了,但结果与实际情况相差甚远。
所以我的问题是:
是否有任何方法可以获取启动器应用程序用于在主屏幕上放置应用程序小部件的网格单元格的大小(或接近它)?请注意,我知道并非所有启动器都遵循Android的公式,但我想找到一种计算其近似值的方法。
---- 编辑 ----
为了更好地理解我的问题,我创建了一个截图:
首先,应用程序小部件的背景是一个没有任何图形或尺寸的形状xml文件。它由Android在可用空间中绘制。在我看来,这是最好的GUI设计(至少有背景)。现在,在屏幕1中,您可以在默认的Android启动器中看到小部件,它看起来非常漂亮,并且调整大小也很好。在屏幕2和3中,您可以在GO-HD启动器中查看它(横向和纵向模式),在此启动器中,它在横向模式下看起来相当小,在纵向模式下则非常大。您可以通过让用户调整边距来解决此问题,如屏幕4所示。
如果您将预览(屏幕4中心的黑暗区域)与默认Android启动器中的原始应用程序小部件进行比较,则会发现它们不匹配。我的问题是如何向用户呈现更好的预览(最接近实际应用程序小部件)。
谢谢,也请原谅我的英语。

1
设计一个更灵活、更能适应不同单元格大小等的 GUI 设计,这样不是更简单可靠吗? - CommonsWare
4个回答

3

您是否已经实现了AppWidgetProvider.onAppWidgetOptionsChanged(Context, AppWidgetManager, int, Bundle)?所有表现良好的启动器都应该报告有关您放置小部件的一些指标,您可以使用类似以下代码从bundle中检索这些指标:

int minwidth_dp = bundle.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH);
int maxwidth_dp = bundle.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH);
int minheight_dp = bundle.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);
int maxheight_dp = bundle.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT);

请注意,这里没有单元格的概念 - 这些指标对应于您的部件实际尺寸,无论它占用多少单元格。
默认启动器将其映射到不同的方向,如下所示:
minwidth -> 竖屏宽度 minheight -> 横屏高度 maxwidth -> 横屏宽度 maxheight -> 竖屏高度
任何在两个方向中保持相同行列数,并调整单元格大小以适应屏幕的启动器,都应该以相同的方式进行映射。请注意,假定这些关系始终���立可能会产生意想不到的结果,如果您嵌入了一个在其微件中执行某些不寻常操作的启动器 - 将它们放置在屏幕的一部分或在不同的方向中使用不同的行或列。
或者,某些启动器可能会将当前方向的指标报告为最小值和最大值,并在方向更改时再次调用您以获取新的指标。但是,如果您只对当前方向感兴趣,则这些启动器的行为与默认启动器兼容。

据我所知,在较低版本中无法获取这些指标。 - j__m
感谢您的回答,使用onAppWidgetOptionsChanged来获取指标的想法已经在我脑海中浮现。然而,在我的情况下无法使用它,因为我想知道每个方向的指标,而不管设备当前设置如何,最重要的是,我想在小部件添加到主屏幕之前即在配置活动中获取指标。无论如何,非常感谢您的时间和非常详细的答案。 - ChD Computers
我认为你不会找到比onAppWidgetOptionsChanged更好的方法了。也许你可以让你的配置活动启动一个非常短的计时器,然后立即finish()。然后,当onAppWidgetOptionsChanged被调用或计时器过期时,你可以startActivity()自己。这种方法最大的缺点可能是用户无法取消添加小部件,因为它已经被技术上添加了。但我无法想象你如何以任何其他方式获得任何可靠的指标。 - j__m

0

我不知道如何制作可靠的预览,但根据方向使用不同的边距可能会有所帮助。您可以使用layout-land和layout-port来指定具有不同边距的不同布局。


我觉得你没有读懂我的问题。这正是我正在做的事情。我只是试图创建一个可靠的预览。 - ChD Computers
从你的问题中并不清楚你是否在纵向/横向布局中使用了不同的边距(只是允许用户调整方向的边距)。也许你两者都在做? - paul
如果我的问题对于边距有误导的地方,我很抱歉(我的英语不是很好,所以可能会出现这种情况)。然而,这个问题是关于创建预览屏幕,而不是关于应用程序小部件的布局。无论如何,还是谢谢。 - ChD Computers

0

我知道已经有一段时间了,但是我的另一个答案刚刚被点赞,所以我有机会以崭新的眼光重新审视这个问题。

我认为对于原始问题的真正答案可能是自己设置小部件的大小,或者只是高度,因为这似乎是截图中的问题。在您的布局中设置 layout_height="@dimen/my_perfect_height",启动器将在单元格内居中显示它。如果您需要一些灵活性,可以使用几种不同的布局和不同的尺寸,让用户在它们之间进行选择。当然,您设置高度后也不会遇到预览问题。


0
有没有办法获取启动器应用程序在主屏幕上放置应用程序小部件时使用的网格单元格大小(或接近它)?
不行。每个主屏幕开发者都可以按照自己的意愿进行操作。
在此启动器中,横向模式下看起来相当小,而纵向模式下则非常大。
那就设计一个适应这些尺寸的设计。例如,您可以查看其他应用程序小部件在该主屏幕上运行时所做的操作。

谢谢你的回答。我已经非常了解第一部分(非常好:))。至于第二部分,我实际上尝试了很多其他小部件,所有可调整大小的小部件都有与非“标准”启动器相关的问题。不可调整大小的没有问题,但我需要创建一个可调整大小的小部件。至于设计,我真的无法想象一个不同的可调整大小的设计如何解决这个问题。欢迎任何想法。再次感谢。 - ChD Computers
@Christos:“欢迎任何想法” - 我的想法是不要担心它。根据你自己的承认,其他人也遇到了同样的问题。然而,他们的应用程序正在被下载,并且可能由于应用程序小部件在最初添加到用户选择的主屏幕时略微不规则的行为而没有获得差评。 - CommonsWare
@Christos 我认为这是正确的答案,你应该接受它。即使它说“抱歉,这是不可能的”像这样。 - Jose_GD
@Jose_GD 我正在努力寻找解决问题的可能方案,根据结果我会回来并发布它或接受最佳答案,即使它说这是不可能的。这个案例仍然是开放的,但无论如何感谢你的建议。 - ChD Computers
@Christos,不用谢。我会关注这个问题的,我对你想要实现的内容很感兴趣。 - Jose_GD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接