最近项⽬中需要实现⼀个GridView显⽰6*5=30项,并铺满整个界⾯,界⾯中还有⾃定义ActionBar等其他控件,所以需要获取剩下屏幕的⾼度。通过百度得知View有⼀个监听函数,亲测使⽤有效,特此记录,⽅便⽇后查阅。
gv_test.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override
public void onGlobalLayout() {
//给GridView设置Adapter,在adapter的getView中获取GridView的⾼度,在这个回调之前获取的⾼度都是0 //处理完后remove掉,⾄于为什么,后⾯有解释 gv_test.getViewTreeObserver()
.removeOnGlobalLayoutListener(this); } });
通过源码追溯进去,找到ViewTreeObserver这个类,⾥⾯有很多interface,都是⽤来追踪View的各种状态变化的。找到OnGlobalLayoutListener
/**
* Interface definition for a callback to be invoked when the global layout state * or the visibility of views within the view tree changes. */
public interface OnGlobalLayoutListener { /**
* Callback method to be invoked when the global layout state or the visibility of views * within the view tree changes */
public void onGlobalLayout(); }
注释的⼤概意思就是这个回调在布局状态和可见状态发⽣变化时回调,所以准确的说,这个不是监听View的加载完成,⽽是监听布局变化的。我们来测试⼀下。
public class MainActivity extends AppCompatActivity { TextView tv_test;
private static final String TAG = \"MainActivity\"; @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
tv_test = (TextView)findViewById(R.id.tv_test);
//app切换到后台,再点开会调⽤⼀次,屏幕关闭运⾏程序会调⽤两次
tv_test.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override
public void onGlobalLayout() { Log.e(TAG, \"onGlobalLayout: \");
} }); }
public void test(View v){ //改变可见性,调⽤⼀次
// tv_test.setVisibility(View.GONE); //改变⽂字布局,没有效果
// tv_test.setGravity(Gravity.CENTER);
//修改控件⼤⼩,调⽤⼀次
// LinearLayout.LayoutParams para = (LinearLayout.LayoutParams) tv_test.getLayoutParams();// para.height = 200;// para.weight = 100;
// tv_test.setLayoutParams(para);
//修改layoutgravity,这个是在LayoutParams中,调⽤⼀次
LinearLayout.LayoutParams para = (LinearLayout.LayoutParams) tv_test.getLayoutParams(); para.gravity = Gravity.CENTER_HORIZONTAL; tv_test.setLayoutParams(para); }}
运⾏程序,得到从android monitor中可以看到,启动后调⽤了三次onGlobalLayout,很奇怪,为什么是三次?后来有⼀次屏幕锁了,发现调⽤了两次。经过测试,app退到后台后重新进⼊会调⽤⼀次,屏幕锁屏后重新打开会调⽤两次(⼩⽶两次,努⽐亚1次),其中⼀次猜测是控件的可见性改变了。
通过按键的测试,分别修改控件的可见性和布局,都会调⽤⼀次,修改控件内部布局,不会调⽤,同时修改布局和可见性,只调⽤⼀次。
到此三次之谜依旧没有解决,不过,可以肯定的是,这个会重复
调⽤多次,使⽤的时候需要注意。解决的办法就是第⼀次回调后,就把回调remove掉,如:gv_test.getViewTreeObserver().removeOnGlobalLayoutListener(this);如有错误,敬请雅正。
以上这篇android监听View加载完成的⽰例讲解就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
因篇幅问题不能全部显示,请点此查看更多更全内容