Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 来自另一个片段的FragmentTransaction调用使活动变量为空_Android_Android Fragments_Xamarin_Fragmenttransaction - Fatal编程技术网

Android 来自另一个片段的FragmentTransaction调用使活动变量为空

Android 来自另一个片段的FragmentTransaction调用使活动变量为空,android,android-fragments,xamarin,fragmenttransaction,Android,Android Fragments,Xamarin,Fragmenttransaction,使用ValueAnimator和自定义的ValueAnimator.Update方法为背景设置动画。在activityonCreate方法中,使用FragmentTransaction第一个片段调用。在第一个片段中,另一个fragmettranstration根据用户按钮单击调用。在第一个事务中,一切正常,但在第二个事务中,ValueAnimator.Update中使用的活动变量变为null。问题在哪里 活动onCreate: private const int TO_LEFT = 0;

使用
ValueAnimator
和自定义的
ValueAnimator.Update
方法为背景设置动画。在activity
onCreate
方法中,使用
FragmentTransaction
第一个片段调用。在第一个片段中,另一个
fragmettranstration
根据用户按钮单击调用。在第一个事务中,一切正常,但在第二个事务中,
ValueAnimator.Update
中使用的活动变量变为null。问题在哪里

活动
onCreate

    private const int TO_LEFT = 0;
    private const int TO_RIGHT = 1;
    private const long DURATION = 15000;

    private int bgAnimDir = TO_LEFT;
    private RectF mDisplayRect = new RectF();
    private Matrix matrix = new Matrix();
    private ValueAnimator bgAnimator;

    [BindView(Resource.Id.background)]
    ImageView background;
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);
        Cheeseknife.Bind(this);

        background.Post(() =>
        {
            animate();
        });


        fragmentTransaction = FragmentManager.BeginTransaction();
        fragmentTransaction.Add(Resource.Id.home_container, new Home(), "Home");
        fragmentTransaction.Commit();
    }
为背景变量和矩阵变量引发空指针异常

animate()
函数:

    private void animate()
    {
        updateDisplayRect();
        if (bgAnimDir == TO_LEFT)
            animate(mDisplayRect.Left, mDisplayRect.Left - (mDisplayRect.Right - background.Width));
        else
            animate(mDisplayRect.Left, 0.0f);
    }

    private void animate(float from, float to)
    {
        bgAnimator = ValueAnimator.OfFloat(from, to);
        bgAnimator.Update +=
            (object sender, ValueAnimator.AnimatorUpdateEventArgs e) =>
            {
                float value = (float)e.Animation.AnimatedValue;
                matrix.Reset();
                matrix.PostTranslate(value, 0);
                background.ImageMatrix = matrix;
            };
        bgAnimator.SetDuration(DURATION);
        bgAnimator.AnimationEnd +=
            (object sender, EventArgs e) =>
            {
                bgAnimDir = bgAnimDir == TO_LEFT ? TO_RIGHT : TO_LEFT;
                animate();
            };
        bgAnimator.Start();
    }
    private void animate(float from, float to)
    {
        bgAnimator = ValueAnimator.OfFloat(from, to);
        bgAnimator.Update +=
            (object sender, ValueAnimator.AnimatorUpdateEventArgs e) =>
            {
                try
                {
                    float value = (float)e.Animation.AnimatedValue;
                    matrix.Reset();
                    matrix.PostTranslate(value, 0);
                    background.ImageMatrix = matrix;
                }
                catch
                {
                    background = (ImageView)FindViewById(Resource.Id.background);
                }
            };
        bgAnimator.SetDuration(DURATION);
        bgAnimator.AnimationEnd +=
            (object sender, EventArgs e) =>
            {
                bgAnimDir = bgAnimDir == TO_LEFT ? TO_RIGHT : TO_LEFT;
                animate();
            };
        bgAnimator.Start();
    }

    private void updateDisplayRect()
    {
        try
        {
            mDisplayRect.Set(0, 0, background.Drawable.IntrinsicWidth, background.Drawable.IntrinsicHeight);
            matrix.MapRect(mDisplayRect);
        }
        catch
        {
            background = (ImageView)FindViewById(Resource.Id.background);
        }
    }

bgAnimator.Update中出现异常
delegate

我使用try,catch解决了这个问题

以下是我的新动画功能:

    private void animate()
    {
        updateDisplayRect();
        if (bgAnimDir == TO_LEFT)
            animate(mDisplayRect.Left, mDisplayRect.Left - (mDisplayRect.Right - background.Width));
        else
            animate(mDisplayRect.Left, 0.0f);
    }

    private void animate(float from, float to)
    {
        bgAnimator = ValueAnimator.OfFloat(from, to);
        bgAnimator.Update +=
            (object sender, ValueAnimator.AnimatorUpdateEventArgs e) =>
            {
                float value = (float)e.Animation.AnimatedValue;
                matrix.Reset();
                matrix.PostTranslate(value, 0);
                background.ImageMatrix = matrix;
            };
        bgAnimator.SetDuration(DURATION);
        bgAnimator.AnimationEnd +=
            (object sender, EventArgs e) =>
            {
                bgAnimDir = bgAnimDir == TO_LEFT ? TO_RIGHT : TO_LEFT;
                animate();
            };
        bgAnimator.Start();
    }
    private void animate(float from, float to)
    {
        bgAnimator = ValueAnimator.OfFloat(from, to);
        bgAnimator.Update +=
            (object sender, ValueAnimator.AnimatorUpdateEventArgs e) =>
            {
                try
                {
                    float value = (float)e.Animation.AnimatedValue;
                    matrix.Reset();
                    matrix.PostTranslate(value, 0);
                    background.ImageMatrix = matrix;
                }
                catch
                {
                    background = (ImageView)FindViewById(Resource.Id.background);
                }
            };
        bgAnimator.SetDuration(DURATION);
        bgAnimator.AnimationEnd +=
            (object sender, EventArgs e) =>
            {
                bgAnimDir = bgAnimDir == TO_LEFT ? TO_RIGHT : TO_LEFT;
                animate();
            };
        bgAnimator.Start();
    }

    private void updateDisplayRect()
    {
        try
        {
            mDisplayRect.Set(0, 0, background.Drawable.IntrinsicWidth, background.Drawable.IntrinsicHeight);
            matrix.MapRect(mDisplayRect);
        }
        catch
        {
            background = (ImageView)FindViewById(Resource.Id.background);
        }
    }
只需在需要时填充空变量


但正如您所猜测的,这并不是一个简单的答案来解释为什么在这个过程中背景变为空

您希望在非活动片段中显示动画,这就是为什么会出现此异常