在Android中的FrameLayout中放置视图

时间:2010-10-03 10:12:10

标签: android android-layout android-framelayout

我想以编程方式在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已被弃用。

任何指针都将非常感激。感谢。

5 个答案:

答案 0 :(得分:11)

以下示例(工作代码)显示了如何在FrameLayout中放置视图(EditText)。此外,它还展示了如何使用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;
        }
    });

}

}

main.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>

答案 1 :(得分:2)

确实,使用FrameLayout,所有孩子都被挂在屏幕的左上角,但你仍然可以设置他们的填充。如果为不同的子项设置不同的填充值,它们将显示在FrameLayout中的不同位置。

答案 2 :(得分:2)

您还可以在新添加的视图周围添加边距,以将其放置在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个像素。

修改:完成了示例,因此它可以自立。哦,是的确有效。

答案 3 :(得分:1)

来自提供的link Quinn1000:

  

您可以将多个子项添加到FrameLayout,但所有子项都挂在屏幕的左上角。

这意味着您无法将View放在FrameLayout内的特定点(除非您希望它位于左上角: - ))。

如果您需要视图的绝对定位,请尝试AbsoluteLayout

  

一种布局,可让您指定其子项的精确位置(x / y坐标)。与没有绝对定位的其他类型的布局相比,绝对布局不够灵活且难以维护。

至于设置View的宽度和高度,就像Quinn1000所说,你提供v.setLayoutParams()方法一个LayoutParams对象,具体取决于你选择的容器(AbsoluteLayout,LinearLayout等)

答案 4 :(得分:0)

此处的线程位于

的stackOverflow上

How do you setLayoutParams() for an ImageView?

稍微介绍一下。

例如: 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:

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

但现在已经晚了,这些联系让我的眼睛流血了一点。让我知道他们是否有任何帮助: - )