适用于Android的Mono中的OnGlobalLayoutListener

时间:2013-01-04 14:02:27

标签: c# java android xamarin.android

有人可以用C#解释我这个Java代码,因为我使用Mono for Android吗?例如,我在Mono for Android中找不到OnGlobalLayoutListener。

在Android上,它看起来像这样:

vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
    int newWidth, newHeight, oldHeight, oldWidth;

    //the new width will fit the screen
    newWidth = metrics.widthPixels;

    //so we can scale proportionally
    oldHeight = iv.getDrawable().getIntrinsicHeight();
    oldWidth = iv.getDrawable().getIntrinsicWidth();
    newHeight = Math.floor((oldHeight * newWidth) / oldWidth);
    iv.setLayoutParams(new LinearLayout.LayoutParams(newWidth, newHeight));
    iv.setScaleType(ImageView.ScaleType.CENTER_CROP);

    //so this only happens once
    iv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
    }
});

Mono for Android等价物是什么?

2 个答案:

答案 0 :(得分:12)

OnGlobalLayoutListener是一个接口,因此在C#中它被公开为ViewTreeObserver.IOnGlobalLayoutListener。由于C#不支持Java中的匿名类,因此您需要提供该接口的实现并将其传递到AddOnGlobalLayoutListener()

public class MyLayoutListener : Java.Lang.Object, ViewTreeObserver.IOnGlobalLayoutListener
{
    public void OnGlobalLayout()
    {
        // do stuff here
    }
}

vto.AddOnGlobalLayoutListener(new MyLayoutListener());

如果需要,您可以执行此操作,但Mono for Android中的首选方法是使用事件代替侦听器接口。在这种情况下,它会作为GlobalLayout事件公开:

vto.GlobalLayout += (sender, args) =>
    {
        // do stuff here
    };

您可以像这样获取ViewTreeObserver的实例:

var contentView = activity.Window.DecorView.FindViewById(Android.Resource.Id.Content);
contentView.ViewTreeObserver.GlobalLayout += ViewTreeObserverOnGlobalLayout;

答案 1 :(得分:0)

以下是来自Android开发者网站的信息:

  

addOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener   听者)

     

注册视图树中全局布局状态或视图可见性更改时要调用的回调

以下是您可以查看的链接:addOnGlobalLayoutListener。在这里onGlobalLayoutListener