lor*_*105 18 layout android fragment dimension
我正在研究一个片段,我想得到一个layout包含在其中的维度xml fragment layout.当我尝试代码时
RelativeLayout myLayout = view.findViewById(R.id.myLayout);
myLayout.getHeight();
它返回0.我需要将这些尺寸放入myLayout其他对象中.
我尝试使用:
myLayout.getViewTreeObserver().addOnGlobalLayoutListener( 
    new ViewTreeObserver.OnGlobalLayoutListener(){
        @Override
        public void onGlobalLayout() {
            mHeight = myLayout.getHeight();  
            mWidth= myLayout.getWidth();
            System.out.println("width: "+mWidth+"   height: "+mHeight);
         }
});
但是这段代码调用了很多时间,我不确切知道它何时执行.我需要将这些尺寸转化为   public void onActivityCreated ()方法.可能吗?
小智 24
有一个更清晰的解决方案,只需在片段的根视图上使用View.post()方法,您可以调用getMeasuredHeight()/ getMeasuredWidth()并获取实际值.
例如
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View root = inflater.inflate(R.layout.myfragment, container, false);
    root.post(new Runnable() {
        @Override
        public void run() {
            // for instance
            int height = root.getMeasuredHeight(); 
        }
    });
    return root;
}
使用ViewTreeObserver非常干净整洁,没有杂乱无章.
我只用android-23设备对它进行了测试,但是从1级开始,API已经有了这个方法.
无论如何,WFM.
Udi*_*shi 10
只要发生小的视图更改,就会调用addOnGlobalLayoutListener.因此,您需要从视图中删除此侦听器.
用法简单:
public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){
if (Build.VERSION.SDK_INT < 16) {
    v.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
} else {
    v.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
}
}
我建议你查一下:
if (myLayout.getHeight()>0 && myLayout.getWidth()>0) {
// Do some code...
removeOnGlobalLayoutListener(..)
}
在 中onActivityCreated,视图尚未测量。
所以不,你无法从那里获得测量结果。onGlobalLayout是一个这样做的好地方。测量后立即进行布局。
如果您只想删除一次侦听器,则可以随后删除侦听器。请注意,布局可以更改大小(例如,出现软键盘)
| 归档时间: | 
 | 
| 查看次数: | 23990 次 | 
| 最近记录: |