怎么在程序开始就获取组件的位置
如何在程序开始就获取组件的位置
因为需要开始初始化的时候就需要获得组件的位置,使用getLeft()等方法可以获得,但是必须在界面绘制完成后,也就是必须在onCreate()方法之后使用,故将获取的代码放在onResume()方法中调用,但是即使这样也不行,这样要如何解决,附上测试代码
TextActivity.java
main.xml
------解决方案--------------------
无法在onCreate函数中直接获取view的尺寸,因为此时界面的layout还没有初始化,通过注册需要监听的view的viewTreeObserver来获取其尺寸,回调函数onGlobalLayout被调用的时候表明相应的view已经初始化了,使用如下方法:
因为需要开始初始化的时候就需要获得组件的位置,使用getLeft()等方法可以获得,但是必须在界面绘制完成后,也就是必须在onCreate()方法之后使用,故将获取的代码放在onResume()方法中调用,但是即使这样也不行,这样要如何解决,附上测试代码
TextActivity.java
- Java code
public class TextActivity extends Activity { Button but; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); but = (Button) findViewById(R.id.button1); but.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 此处点击可以获取到,但是放在外面就获取不到 Log.v("zing", "but.getLeft() =" + but.getLeft()); } }); } @Override protected void onResume() { // 这里第一次运行程序会执行一次,而第二次开始只执行一次 Log.v("zing", "onResume"); Log.v("zing", "but.getLeft() =" + but.getLeft()); super.onResume(); } }
main.xml
- XML code
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff" android:orientation="vertical" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="Button" /> </RelativeLayout> </LinearLayout>
------解决方案--------------------
无法在onCreate函数中直接获取view的尺寸,因为此时界面的layout还没有初始化,通过注册需要监听的view的viewTreeObserver来获取其尺寸,回调函数onGlobalLayout被调用的时候表明相应的view已经初始化了,使用如下方法:
- Java code
ViewTreeObserver viewTreeObserver = view.getViewTreeObserver(); if (viewTreeObserver.isAlive()) { viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.getViewTreeObserver().removeGlobalOnLayoutListener(this); viewWidth = mediaGallery.getWidth(); viewHeight = mediaGallery.getHeight(); } }); }