android - 自定义 View 未出现

标签 android

当我注释掉 setContentView(boardView);在我的 Game.java 中,我在 BoardView 中的自定义 View 工作正常并且很好地显示了所有内容......但是 onSizeChanged 永远不会在 BoardView.java 中被调用......所以我无法在运行时读取设备宽度和高度。如果我离开 setContentView 未注释 onSizeChanged 工作......但屏幕是空白的!

我希望能够在运行时读取屏幕宽度和高度,并在创建时设置我的 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);
        }
    }
}

最佳答案

以为我解决了自己的问题。我忽略了使用 Overriden onDraw 方法放置我的 View 构建代码。即:

@Override
protected void onDraw(Canvas canvas)
{

    LinearLayout maincontainer = new LinearLayout(this.game);

    // etc..

我只是将它包含在主类中,而不是重写 onDraw...当您扩展 View 时您必须这样做。

关于android - 自定义 View 未出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2933219/

相关文章:

android - Activity 从模拟器中的主屏幕启动器恢复,但不是在 Android 设备上

android - Handler.postdelayed

java - Android后台服务错误: Can't create handler inside thread that has not called

android - Retrofit - @Body 参数不能与表单或多部分编码一起使用

java - 推送通知警报文本的最大长度是多少?

java - 如何使用android以编程方式找到网络上IP Cam的IP地址

java - 在 Android 上通过套接字接收实时音频数据

android - 在 flutter 中热重载后更新更改?

android - 为什么即使应用程序处于后台,BroadcastReceiver 也能正常工作?

android - 我应该如何初始化 SKMapInitSettings 的路径?