如何创build一个没有“setContentView(R.layout.main)”的活动

我知道它可能通过做像下面的代码创build活动,其中视图不是从XML文件设置,但是像这样:setContentView(new myView(this));

我不明白的是如何使用这段代码,但仍然有能力定制它,例如,如果我想添加一个button的代码波纹pipe,我将如何做,因为我不能简单地添加一个XML布局可以吗?

任何好的答复,这将非常感谢提前非常多!

package com.faceapp; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PointF; import android.media.FaceDetector; import android.media.FaceDetector.Face; import android.os.Bundle; import android.view.View; public class FaceappActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.main); setContentView(new myView(this)); } private class myView extends View{ private int imageWidth, imageHeight; private int numberOfFace = 5; private FaceDetector myFaceDetect; private FaceDetector.Face[] myFace; float myEyesDistance; int numberOfFaceDetected; Bitmap myBitmap; public myView(Context context) { super(context); // TODO Auto-generated constructor stub BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options(); BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565; myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.face5, BitmapFactoryOptionsbfo); imageWidth = myBitmap.getWidth(); imageHeight = myBitmap.getHeight(); myFace = new FaceDetector.Face[numberOfFace]; myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace); numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub canvas.drawBitmap(myBitmap, 0, 0, null); Paint myPaint = new Paint(); myPaint.setColor(Color.GREEN); myPaint.setStyle(Paint.Style.STROKE); myPaint.setStrokeWidth(3); for(int i=0; i < numberOfFaceDetected; i++) { Face face = myFace[i]; PointF myMidPoint = new PointF(); face.getMidPoint(myMidPoint); myEyesDistance = face.eyesDistance(); canvas.drawRect( (int)(myMidPoint.x - myEyesDistance), (int)(myMidPoint.y - myEyesDistance), (int)(myMidPoint.x + myEyesDistance), (int)(myMidPoint.y + myEyesDistance), myPaint); } } } } 

^^^^^^^^^^^^^^^回答

如何定位button和imageview? (理想情况下使用相对布局)下图显示了我的意思:(忽略图像的大小)

在这里输入图像说明 新代码:

 package com.test; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PointF; import android.media.FaceDetector; import android.media.FaceDetector.Face; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; public class TesttActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout layout = new LinearLayout(this); Button button = new Button(this); button.setText("Button!"); layout.addView(button); myView custom = new myView(this); layout.addView(custom); setContentView(layout); } private class myView extends View{ private int imageWidth, imageHeight; private int numberOfFace = 5; private FaceDetector myFaceDetect; private FaceDetector.Face[] myFace; float myEyesDistance; int numberOfFaceDetected; Bitmap myBitmap; public myView(Context context) { super(context); // TODO Auto-generated constructor stub BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options(); BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565; myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.face5, BitmapFactoryOptionsbfo); imageWidth = myBitmap.getWidth(); imageHeight = myBitmap.getHeight(); myFace = new FaceDetector.Face[numberOfFace]; myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace); numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub canvas.drawBitmap(myBitmap, 0, 0, null); Paint myPaint = new Paint(); myPaint.setColor(Color.GREEN); myPaint.setStyle(Paint.Style.STROKE); myPaint.setStrokeWidth(3); for(int i=0; i < numberOfFaceDetected; i++) { Face face = myFace[i]; PointF myMidPoint = new PointF(); face.getMidPoint(myMidPoint); myEyesDistance = face.eyesDistance(); canvas.drawRect( (int)(myMidPoint.x - myEyesDistance), (int)(myMidPoint.y - myEyesDistance), (int)(myMidPoint.x + myEyesDistance), (int)(myMidPoint.y + myEyesDistance), myPaint); } } } } 

Solutions Collecting From Web of "如何创build一个没有“setContentView(R.layout.main)”的活动"

你可以传递setContentView()任何forms的视图,作为你的布局的根视图。 下面是一个带有Button和myView的dynamic构build的LinearLayout。

 public class Example extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout layout = new LinearLayout(this); // Define the LinearLayout's characteristics layout.setGravity(Gravity.CENTER); layout.setOrientation(LinearLayout.VERTICAL); // Set generic layout parameters LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); Button button = new Button(this); button.setText("Button!"); layout.addView(button, params); // Modify this myView custom = new myView(this); layout.addView(custom, params); // Of course, this too setContentView(layout); } } 

理解你只能添加子视图到你的根视图,如果你传递setContentView()一个ViewGroup; 像RelativeLayout,LinearLayout等。换句话说,你不能这样做:

  myView custom = new myView(this); Button button = new Button(this); button.setText("Button!"); custom.addView(button); // Nope! Method "addView()" does not exist for a regular View... setContentView(custom); 

此外,命名约定表明,类名中的每个单词都应该有第一个字母大写。 所以myView应该是MyView ,至less它使得你的代码更容易被其他程序员阅读,编译器会用正确的颜色突出你的类variables。