首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

怎么在程序开始就获取组件的位置

2012-04-13 
如何在程序开始就获取组件的位置因为需要开始初始化的时候就需要获得组件的位置,使用getLeft()等方法可以

如何在程序开始就获取组件的位置
因为需要开始初始化的时候就需要获得组件的位置,使用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();    }  });} 

热点排行