是否可以将按钮添加到以编程方式设置的framelayout?

这有点难以描述,但我会尽我所能:

我正在开发一个使用自定义相机活动的Android应用程序。 在此相机活动中,我使用以编程方式创建表面视图并将其设置为在xml布局文件中定义的framelayout(覆盖全屏)。

我现在的问题是,如何在框架布局中添加其他元素? 只能以编程方式? 我问,因为到目前为止我只能以编程方式添加其他元素。 我在xml布局中添加的元素没有出现在屏幕上。 它们可能只是我添加到框架布局的表面视图的后面吗? 如果是这样,是否可以将它们带到前线?

感谢你们!

当然,您可以向FrameLayout添加任意数量的按钮和其他小部件。 由于FrameLayout允许堆叠视图,因此您在xml文件中添加的组件现在位于以编程方式添加的View之后。 以下是动态创建和添加小部件的方法:

 // find your framelayout frameLayout = (FrameLayout) findViewById(....); // add these after setting up the camera view // create a new Button Button button1 = new Button(this); // set button text button1.setText("...."); // set gravity for text within button button1.setGravity(Gravity.....); // set button background button1.setBackground(getResources().getDrawable(R.drawable.....)); // set an OnClickListener for the button button1.setOnClickListener(new OnClickListener() {....}) // declare and initialize LayoutParams for the framelayout FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); // decide upon the positioning of the button // // you will likely need to use the screen size to position the // button anywhere other than the four corners params.setMargins(.., .., .., ..); // use static constants from the Gravity class params.gravity = Gravity.CENTER_HORIZONTAL; // add the view fl1.addView(button2, params); // create and add more widgets .... .... 

编辑1:

你可以在这里使用一个技巧:

 // Let's say you define an imageview in your layout xml file. Find it in code: imageView1 = (ImageView) findViewById(....); // Now you add your camera view. ......... // Once you add your camera view to the framelayout, the imageview will be // behind the frame. Do the following: framelayout.removeView(imageView1); framelayout.addView(imageView1); // That's it. imageView1 will be on top of the camera view, positioned the way // you defined in xml file 

这是因为:

子视图在堆栈中绘制,最近添加的子项位于顶部(来自FrameLayout上的android资源页面)

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

“FameLayout旨在阻挡屏幕上的某个区域以显示单个项目。通常,FrameLayout应该用于保存单个子视图,因为以可扩展到不同屏幕大小的方式组织子视图可能很困难但是,您可以使用android:layout_gravity属性,通过为每个孩子分配重力,将多个孩子添加到FrameLayout并控制他们在FrameLayout中的位置。