【问题标题】:How to create an activity without 'setContentView(R.layout.main)'如何在没有“setContentView(R.layout.main)”的情况下创建活动
【发布时间】:2012-06-24 06:01:38
【问题描述】:

我知道它可以通过执行以下代码来创建活动,其中视图不是从 xml 文件设置的,而是像这样:setContentView(new myView(this));

我不明白如何使用此代码,但仍然可以自定义它,例如,如果我想在下面的代码中添加一个按钮,我该怎么做,因为我不能简单地添加一个我可以转成 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);
            }
  }
    }
}

^^^^^^^^^^^^^^^ 回复了

如何定位按钮和图像视图? (理想情况下使用相对布局) 下图向您展示了我的意思: (忽略图片大小调整)

新代码:

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);
               }
     }
       }
   }

【问题讨论】:

    标签: android layout views


    【解决方案1】:

    您可以传递 setContentView() 任何形式的视图,作为布局的根视图。下面是一个动态构建的 LinearLayout,带有一个 Button 和您的 myView。

    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,至少它可以让其他程序员更容易阅读你的代码,并且编译器会用正确的颜色突出显示你的类变量。

    【讨论】:

    • 非常感谢 Sam,我成功了。我现在唯一的问题是定位项目,例如由 myView/onDraw 创建的按钮和 imageView。我会更新问题以向您展示我的意思。 :)
    • 我猜你可以通过RelativeLayout layout = new RelativeLayout(this);但是如何定位按钮和图像视图?,谢谢
    • @user1472757 我更新了答案中的代码。每个属性都可以在 XML 或 Java 中设置,在开发人员指南中,XML 属性有一个“相关方法”,它是 Java 函数的同义词(即对于 LinearLayout,android:orientation 是 setOrientation())。
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 2015-03-07
    • 2016-12-12
    相关资源
    最近更新 更多