0

我有一个问题,如果我尝试使用 and 获取我的高度和宽度,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

4 回答 4

9

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

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

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

编辑。容器必须标记为 final 才能在内部运行中访问

于 2013-08-21T14:22:58.463 回答
1

LinearLayout 容器 = (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);
    }
}
于 2014-01-15T11:10:51.627 回答
0

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

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

于 2013-08-21T14:15:17.557 回答
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));
于 2013-08-21T14:15:44.007 回答