我遇到了问题,如果我尝试使用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);
}
答案 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));