无法在Activity android中以编程方式重新定位视图

时间:2015-06-25 03:54:52

标签: android android-activity dynamic android-view

我在Activity中有5个按钮,具有相对布局。我有一个叫做的函数 init(),它会使用 setX() setY()重新定位按钮。当我从onClickListener中调用 init()时,按钮会重新排列,没有任何问题。但是当我从 onCreate() onStart()调用该函数时,日志显示该函数已执行但按钮保持在相同位置。我该怎么办?

此外,如果我从 onResume()调用init(),按钮会重新定位而不会出现问题。

public class MainActivity extends ActionBarActivity {
@Override
protected void onStart()
{
    super.onStart();
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //if init() is called here I can see the Log "Tag/Init Executed" but the buttons are not repositioned
}
@Override
protected void onResume()
{
    Log.i("Log", "resume called");
    super.onResume();
    //if i call init() here, the button is not repositioned but if i click home button and resume the app again, the button is repositioned.
}
public void init()
{
    Log.i("Tag","Init Executed");
    b1=(ImageButton)findViewById(R.id.imageButton);
    b1.setX(p.x);
    b1.setY(p.y);
}
}

2 个答案:

答案 0 :(得分:0)

<强>的onCreate():

首次创建活动时调用。这是您应该执行所有常规静态设置的地方:创建视图,将数据绑定到列表等。此方法还为您提供包含活动先前冻结状态的Bundle(如果有)。始终紧跟onStart()。

<强> onRestart():

在您的活动停止之后,再次启动之前调用。始终紧跟onStart()

<强>在onStart():

当活动对用户可见时调用。如果活动到达前台,则按onResume(),如果隐藏,则按onStop()。

Android activity life cycle - what are all these methods for?

答案 1 :(得分:0)

好的,很久以前我解决了这个问题。刚才有时间更新它。使用它后,它对我有用。

View myView=view.findViewById(R.id.parent);
myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
         init();
    }