安卓中替代AbsoluteLayout的是什么?

3

我看到一些帖子说FrameLayout是替代方案,我应该使用边距来定位元素(这让我感到非常反直觉,但好吧...如果它能工作,我会接受它)。然而,我无法使其正常工作,所以我正在寻求帮助。

以下是我的代码:

    FrameLayout layout = new FrameLayout(this);
    layout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

    Button btn = new Button(this);
    btn.setBackgroundResource(R.drawable.btn);

    FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    lp.setMargins(100,100,100,100);

    btn.setLayoutParams(lp);   //i've tried with and without this line, no change

    layout.addView(btn , lp);

无论我做什么,该按钮都会被绘制在0,0处。当我将布局参数(lp's LayoutParam)更改为FILL_PARENT时,按钮就会被拉伸以占据整个屏幕(这是有道理的)。如何使它在屏幕上的其他位置绘制出来,而与其他内容无关呢?在代码中,我的意图是创建一个按钮,将其传递给布局,并在屏幕的100,100处绘制它。我知道这可能在不同的设备上意味着不同的事情,但我需要一种在运行时以编程方式将项放置在特定位置的方法。我不想依赖于重力(或热力学定律)。我只想指定一个位置并让元素出现在那里 :)

我尝试了你的代码,按钮距离左上角 (100, 100) 处。也许这是一个在 Android 的后续版本中已经修复的 bug 。 - hultqvist
我刚刚发布了一个库,可能会对这个案例感兴趣。github.com/ManuelPeinado/ImageLayout - Manuel
3个回答

4
许多人指出,在屏幕上设置一个绝对像素位置的按钮是一个非常糟糕的想法,并且永远不会在所有可用的Android手机上起作用。我相信有更好的方法来实现您想要的布局。
然而,为了回答提出的问题:要在运行时定位它,您可以使用AbsoluteLayout.LayoutParms。
AbsoluteLayout absoluteLayout = //get absolute layout

Button button = new Button();
AbsoluteLayout.LayoutParms params = absoluteLayout.generateDefaultLayoutParams();
params.x = 100;
params.y = 100;

absoluteLayout.addView(button, params);

1

好的,你看一下那个链接里是怎么描述FrameLayout和AbsoluteLayout都有一个android:layout_x参数的?编译器并不会识别layoutX或layout_x以及任何与FrameLayout或AbsoluteLayout相关的东西。所以,我现在想做的就是在运行时将元素放置在特定位置,但我却没有看到任何可以做到这一点的方法。 - Yevgeny Simkin

0

你的布局最终目标是什么?如果你只需要一个按钮——比如说在屏幕中央,你可以创建一个包含以下内容的布局:

<RelativeLayout
    android:xmlns="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    >
    <Button
        android:id="@+id/the_button"
        android:layout_width="wrap_content"
        android:layout_height = "wrap_content"
        android:text="@string/the_button_text"
        />
</RelativeLayout>

AbsoluteLayout 是一个坏主意,因为您需要支持大量的屏幕分辨率。在一个屏幕上超出 100 像素可能只是到达屏幕中间,而在更高 dpi 设备上却可能不到屏幕四分之一的位置。

3
我一遍又一遍地看到这个答案……我明白了……屏幕大小是不同的。但这太令人沮丧了。我不是在寻找解决问题的替代方案……我正在寻求“解决方案”!我不想要一个位于中心的按钮。根据设计,我希望它出现在特定的位置上。我有一个图形设计,要求按钮位于特定的X和Y位置。我可以接受多种屏幕大小。我愿意使用AbsoluteLayout(我知道它已经过时)……我只是想要答案 :) - Yevgeny Simkin
3
如果你认为每个编程问题只有一个单一答案,那么也许你应该考虑做其他的事情了。 - Falmarri
1
你的问题标题正在寻找一个替代方案。你想把它放在相对于屏幕左上角的特定x、y坐标中吗?你想把它放在相对于布局中另一个对象的x、y坐标中吗?如果你非常确定要使用AbsoluteLayout,请继续,但这并不是正确的方法。 - Kevin Coppock
2
我有一个图形设计,需要按钮在特定的X和Y位置。然后修复设计。 - CommonsWare
1
好的,来吧。没有必要对抗。你们都曾经处于这样的情况,需要让一个设计变得可行。通常情况下,即使不是最佳方式,也总有一种方法。多个屏幕分辨率并不是什么新现象!在Brew和J2ME环境中,环境非常多样化,但这并不妨碍我们在屏幕上绘制想要的东西。无论如何...如果真的没有答案,我会把问题撤下来。 - Yevgeny Simkin
显示剩余13条评论

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