11

我想以编程方式在 FrameLayout 中添加一个视图,并将其放置在布局中具有特定宽度和高度的特定点中。FrameLayout 支持这个吗?如果不是,我应该使用中间 ViewGroup 来实现这一点吗?

int x; // Can be negative?
int y; // Can be negative?
int width;
int height;
View v = new View(context);
// v.setLayoutParams(?); // What do I put here?
frameLayout.addView(v);

我最初的想法是在 FrameLayout 中添加一个 AbsoluteLayout,并将视图放置在 AbsoluteLayout 中。不幸的是,我刚刚发现 AbsoluteLayout 已被弃用。

任何指针将不胜感激。谢谢。

4

5 回答 5

12

以下示例(工作代码)显示了如何将视图 (EditText) 放置在 FrameLayout 内。它还显示了如何使用 FrameLayout 的 setPadding 设置器设置 EditText 的位置(每次用户单击 FrameLayout,EditText 的位置设置为单击的位置):

public class TextToolTestActivity extends Activity{
    FrameLayout frmLayout;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        frmLayout = (FrameLayout)findViewById(R.id.frameLayout1);
        frmLayout.setFocusable(true);
        EditText et = new EditText(this);

        frmLayout.addView(et,100,100);
        frmLayout.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.i("TESTING","touch x,y == " + event.getX() + "," +     event.getY() );
                frmLayout.setPadding(Math.round(event.getX()),Math.round(event.getY()) , 0, 0);
            return true;
        }
    });

}

}

主要的.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <FrameLayout 
        android:id="@+id/frameLayout1" 
        android:layout_height="fill_parent" android:layout_width="fill_parent">
    </FrameLayout>

</LinearLayout>
于 2012-01-19T18:46:18.840 回答
3

您还可以在新添加的视图周围添加边距,以将其定位在 FrameLayout 内。

FrameLayout frameLayout = (FrameLayout) findViewById(R.id.main); // or some other R.id.xxx
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.setMargins(0, metrics.heightPixels - 20, 0, 0);
View v = new View(context);
v.setLayoutParams(params);
frameLayout.addView(v);

这会将 FrameLayout 定位在距屏幕底部 20 像素处。

编辑:完成示例,使其独立。哦,是的,它确实有效。

于 2014-03-25T13:11:47.350 回答
2

确实,使用 FrameLayout 所有子项都固定在屏幕的左上角,但您仍然可以控制设置它们的填充。如果您为不同的子级设置不同的填充值,它们将显示在 FrameLayout 的不同位置。

于 2011-02-27T07:27:39.640 回答
1

From the link Quinn1000 provided:

You can add multiple children to a FrameLayout, but all children are pegged to the top left of the screen.

This means you can't put your View at a specific point inside the FrameLayout (except you want it to be at the top left corner :-)).

If you need the absolute positioning of the View, try the AbsoluteLayout:

A layout that lets you specify exact locations (x/y coordinates) of its children. Absolute layouts are less flexible and harder to maintain than other types of layouts without absolute positioning.

As for setting the width and height of the View, also like Quinn1000 said, you supply the v.setLayoutParams() method a LayoutParams object, depending on the container you chose (AbsoluteLayout, LinearLayout, etc.)

于 2010-10-03T12:37:54.870 回答
0

stackOverflow 上的线程位于

如何为 ImageView 设置LayoutParams()?

在某种程度上涵盖了它。

例如:LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(30, 30); yourImageView.setLayoutParams(layoutParams);

意味着您需要定义一个 LinearLayout.LayoutParams(或在您的情况下为 FrameLayout.layoutParams)对象以传递给您的 v 对象的 setLayoutParams 方法。

http://developer.android.com/reference/android/widget/FrameLayout.html

它几乎使您看起来可以要求您的 v :

如果您没有专门定义参数,请通过此方法生成DefaultLayoutParams()。

但是已经很晚了,这些链接让我的眼睛有点流血。让我知道他们是否有任何帮助:-)

于 2010-10-03T12:22:12.590 回答