Android “自定义”视图不显示

Android “自定义”视图不显示,android,Android,当我注释掉setContentView(boardView)时;在my Game.java中,BoardView中的自定义视图工作正常,并且可以很好地显示所有内容。。。但是onSizeChanged从未在BoardView.java中被调用。。。因此,我无法在运行时读取设备的宽度和高度。如果我让setContentView在SizeChanged works上保持未注释状态。。。但是屏幕是空白的 我希望能够在运行时读取屏幕宽度和高度,并在创建时设置ImageView的大小,使其成为最佳大小 pu

当我注释掉setContentView(boardView)时;在my Game.java中,BoardView中的自定义视图工作正常,并且可以很好地显示所有内容。。。但是onSizeChanged从未在BoardView.java中被调用。。。因此,我无法在运行时读取设备的宽度和高度。如果我让setContentView在SizeChanged works上保持未注释状态。。。但是屏幕是空白的

我希望能够在运行时读取屏幕宽度和高度,并在创建时设置ImageView的大小,使其成为最佳大小

public class Game extends Activity implements OnClickListener{

    private BoardView boardView;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        boardView = new BoardView(this);

        setContentView(boardView);  // when this line disabled, it looks ok
        boardView.requestFocus();
    }

    public class BoardView extends View {
        private final Game game;
        private float width; // width of one unit
        private float height; // height of one unit

        public BoardView(Context context){
            super(context);
            this.game = (Game)context;
            setFocusable(true);
            setFocusableInTouchMode(true);

            LinearLayout maincontainer = new LinearLayout(game);
            maincontainer.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
            maincontainer.setGravity(Gravity.CENTER);
            maincontainer.setOrientation(LinearLayout.VERTICAL);   
            maincontainer.setBackgroundColor(Color.BLACK);

            LinearLayout innercontainer = new LinearLayout(game);
            innercontainer.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
            innercontainer.setGravity(Gravity.CENTER);
            innercontainer.setOrientation(LinearLayout.HORIZONTAL);   

            // declare a new table
            TableLayout layout = new TableLayout(game);
            layout.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); 

            // build a grid of ImageViews in a TableLayout
            for (int f=1; f<=7; f++) {
                TableRow tr = new TableRow(game);
                for (int c=1; c<=7; c++) {
                 ImageView b = new ImageView(game);
                 b.setImageResource(R.drawable.neworb);
                 b.setOnClickListener(game);             
                    tr.addView(b, 30,30);  // I'd like to not use fixed values here
                } // for
                layout.addView(tr);
            } // for
            innercontainer.addView(layout);
            maincontainer.addView(innercontainer);

            game.setContentView(maincontainer);
        }

        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh){
            width = w/9f;
            height = width;

            super.onSizeChanged(w, h, oldw, oldh);
        }
    }
}
公共类游戏扩展活动{
私人BoardView BoardView;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
boardView=新的boardView(本);
setContentView(boardView);//当这行被禁用时,它看起来正常
requestFocus();
}
公共类BoardView扩展了视图{
私人决赛;
专用浮点宽度;//一个单元的宽度
专用浮子高度;//一个单元的高度
公共BoardView(上下文){
超级(上下文);
this.game=(游戏)上下文;
设置聚焦(真);
setFocusableInTouchMode(真);
LinearLayout maincontainer=新的LinearLayout(游戏);
maincontainer.setLayoutParams(新的LinearLayout.LayoutParams(LayoutParams.FILL\u父级,LayoutParams.FILL\u父级));
主容器。设置重力(重力。中心);
主容器。设置方向(线性布局。垂直);
maincontainer.setBackgroundColor(颜色:黑色);
LinearLayout innercontainer=新的LinearLayout(游戏);
innercontainer.setLayoutParams(新的LinearLayout.LayoutParams(LayoutParams.WRAP_内容,LayoutParams.WRAP_内容));
innercontainer.setGravity(Gravity.CENTER);
设置方向(LinearLayout.HORIZONTAL);
//声明一个新表
TableLayout=新的TableLayout(游戏);
layout.setLayoutParams(新的TableLayout.LayoutParams(LayoutParams.WRAP_内容,LayoutParams.WRAP_内容));
//在TableLayout中构建ImageView网格

for(int f=1;f认为我解决了自己的问题。我忽略了使用重写的onDraw方法放置我的视图构建代码。即:

@Override
protected void onDraw(Canvas canvas)
{

    LinearLayout maincontainer = new LinearLayout(this.game);

    // etc..

我只是把它包含在主类中,而不是覆盖onDraw…这是扩展View时必须做的。

***************************************************实际上,这不是一个很好的解决方案。是的,它起了作用。但是……现在我正在创建新对象,并在每次屏幕绘制时都将其抛出。非常糟糕的形式。LogCat告诉我正在进行垃圾收集或者加班。我在这里绊倒了,实际上是在寻找其他东西,但我忍不住注意到,您花了时间发布了自己的解决方案,并警告未来的读者它的缺点。我不会从中受益,很遗憾,但我相信很多人会。谢谢!