LinearLayout的宽度和高度为零

时间:2013-08-21 14:12:12

标签: android layout

我遇到了问题,如果我尝试使用LinearLayout.getWidth()LinearLayout.getHeight()来获取我的高度和宽度,我得到的int是0。

这是我的onCreat:

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    View mainView = getLayoutInflater().inflate(R.layout.activity_game, null);
    LinearLayout container = (LinearLayout) mainView.findViewById(R.id.container);
    view = new GameLayout(this, container.getWidth(), container.getHeight());
    container.addView(view);
    setContentView(mainView);       
    view.setOnClickListener(this);
}

如果您有任何想法,我做错了什么,请帮忙。

我需要这个来获取布局的大小,因为我想要将我的位图放在每个设备上相同的百分比位置(例如每次都在屏幕的正中心)。

编辑:

解决方案:

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    View mainView = getLayoutInflater().inflate(R.layout.activity_game, null);
    final LinearLayout container = (LinearLayout) mainView.findViewById(R.id.container);
    mainView.post(new Runnable() 
    {
        @Override
        public void run() 
        {
            view = new GameLayout(GameActivity.this, container.getWidth(), container.getHeight());
            container.addView(view);
            view.setOnClickListener(GameActivity.this);
        }
    } );

    setContentView(mainView);   
}

4 个答案:

答案 0 :(得分:9)

它返回零,因为尚未计算布局的大小。要克服这种情况,您可以通过以下方式在主视图队列中发布Runnable:

  mainView.post(new Runnable() {
        @Override
        public void run() {
            view = new GameLayout(this, container.getWidth(), container.getHeight());
        } );

runnable将作为主视图队列的最后一个元素执行。那时,应该已经计算出容器的大小。

编辑。容器必须标记为final才能在内部可运行的

中访问

答案 1 :(得分:1)

LinearLayout container =(LinearLayout)mainView.findViewById(R.id.container); 对象容器已创建。但是View没有加载,你无法获得真正的参数大小。需要加载视图,然后获取高度和宽度。您可以在onResume()方法中尝试它。结果将是相同的。 我解决了创建AsyncTask类并在加载视图后调用它的问题。如此实现你想要的。

LinearLayout linearLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_notes);



    new SizeS().execute();
}

private class SizeS extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        linearLayout = (LinearLayout) findViewById(R.id.linearLayoutBookAlbums);
        int k = linearLayout.getWidth();
        Log.d("testA", Integer.toString(k));
        super.onPostExecute(result);
    }
}

答案 2 :(得分:0)

在计算布局之后,高度和宽度将为0,这发生在onResume()之后,我想。绝对是在onCreate()之后。设置GameLayout的大小时,请改用LayoutParams.MATCH_PARENT。

设置内容视图时,只会将其排队以将其绘制到屏幕上。尺寸仅在将视图绘制到屏幕时计算,直到onResume()之后才会发生。

答案 3 :(得分:0)

你应该用这个:

new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,getWindowManager().getDefaultDisplay().getHeight()-100));

或者这个也是:

ll.setLayoutParams(new android.view.ViewGroup.LayoutParams(
        android.view.ViewGroup.LayoutParams.FILL_PARENT,
        android.view.ViewGroup.LayoutParams.WRAP_CONTENT));