cyd*_*den 20 android android-layout
在ManActivity onCreate()中,我实例化了一个新视图,并通过layout.addView将其添加到活动中.如果我为该视图尝试getX()或getY(),我总是得到0.0.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout main = (RelativeLayout)findViewById(R.id.main);
RelativeLayout.LayoutParams squarePosition = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
GameToken square1 = new GameToken(this,GameToken.SQUARE, fieldHeight,fieldWidth);
squarePosition.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
squarePosition.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
main.addView(square1, squarePosition);
System.out.println(square1.getX()); //Prints '0.0'
System.out.println(square1.getY()); //Prints '0.0'
Run Code Online (Sandbox Code Playgroud)
Tan*_*.7x 30
ViewGroup例如,RelativeLayout不要立即布置他们的孩子,因此你的View还不知道它将在屏幕上的位置.RelativeLayout在发生这种情况之前,您需要等待完成布局传递.
您可以像这样监听全局布局事件:
view.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// Layout has happened here.
// Don't forget to remove your listener when you are done with it.
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
Run Code Online (Sandbox Code Playgroud)
小智 12
另一种选择是使用post(Runnable action)方法:
view.post(new Runnable() {
@Override
public void run() {
System.out.println(view.getX());
System.out.println(view.getY());
}
});
Run Code Online (Sandbox Code Playgroud)
这将导致在完成其他待处理任务(例如布局)之后执行Runnable.
| 归档时间: |
|
| 查看次数: |
11843 次 |
| 最近记录: |