5

私はAndroid用のMonoを使用しているので、C#でこのJavaコードを説明してもらえますか?たとえば、MonoforAndroidで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);
    }
});

Android用のMonoと同等のものは何ですか?

4

2 に答える 2

15

OnGlobalLayoutListenerはインターフェイスであるため、C#ではとして公開されViewTreeObserver.IOnGlobalLayoutListenerます。ここJavaで見られるように、C#は匿名クラスをサポートしていないため、そのインターフェイスの実装を提供し、それを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;
于 2013-01-04T14:35:46.973 に答える
0

Androidデベロッパーのウェブサイトからの情報は次のとおりです。

addOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListenerリスナー)

グローバルレイアウト状態またはビューツリー内のビューの可視性が変更されたときに呼び出されるコールバックを登録します

ご覧いただけるリンクは次のとおりです:addOnGlobalLayoutListener。そしてここonGlobalLayoutListener

于 2013-01-04T14:14:06.257 に答える