【问题标题】:Override bool in fragment using C# - Xamarin使用 C# 覆盖片段中的 bool - Xamarin
【发布时间】:2018-05-18 07:21:53
【问题描述】:

我的代码有问题。覆盖布尔在片段中不起作用,但是当我在活动上尝试它时。它完美地工作。错误显示“找不到合适的方法来覆盖”。我不知道为什么覆盖布尔在片段中不起作用。

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
using SupportFragment = Android.Support.V4.App.Fragment;
using Android.Support.Design.Widget;
using Android.Support.V7.App;
using Android.Support.V4.Widget;
using Android.Support.V4.App;
using Android.Views.Animations;

namespace EFCAndroid
{
    public class Fragment_menu : SupportFragment
    {
        private float initialX;
        private ViewFlipper viewflipper;
        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Create your fragment here
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            // Use this to return your custom view for this Fragment
            // return inflater.Inflate(Resource.Layout.YourFragment, container, false);
            View view = inflater.Inflate(Resource.Layout.fragment_menu, container, false);

            viewflipper = view.FindViewById<ViewFlipper>(Resource.Id.viewFlipper);

            viewflipper.SetInAnimation(Activity, Resource.Animation.fade_in);
            viewflipper.SetOutAnimation(Activity, Resource.Animation.fade_out);
            viewflipper.SetFlipInterval(5000);
            viewflipper.StartFlipping();

            return view;

        }

        public override bool OnTouchEvent(MotionEvent ontouch)
        {

            //switch (ontouch.Action)
            switch(ontouch.Action)
            {
                case MotionEventActions.Down:
                    initialX = ontouch.GetX();
                    break;
                case MotionEventActions.Up:
                    float finalX = ontouch.GetX();
                    if (initialX > finalX)
                    {
                        if (viewflipper.DisplayedChild == 1)
                            break;
                        //viewflipper.SetInAnimation(this, Resource.Animation.fade_in);
                        //viewflipper.SetInAnimation(this, Resource.Animation.fade_out);
                        viewflipper.ShowNext();
                    }
                    else
                    {
                        if (viewflipper.DisplayedChild == 0)
                            break;
                        //viewflipper.SetInAnimation(this, Resource.Animation.fade_in);
                        //viewflipper.SetInAnimation(this, Resource.Animation.fade_out);
                        viewflipper.ShowPrevious();
                    }
                    break;
            }
            return false;
        }

    }
}

【问题讨论】:

  • Fragment 没有 ontouchevent 方法
  • 嗨。我试试你给我的例子。但仍然无法正常工作。我把覆盖放在 view.setontouchlistener 里面。但仍然得到错误说没有找到合适的方法来覆盖:3
  • 我的回答对你有用吗?
  • 当我写 (new View.IOnTouchListener() 时仍然出错 C# 中没有名为 view.ontouchlistener() 的函数:(
  • 不是view.ontouchlistener(),是view.SetOnTouchListener();,注意包裹,是using Android.Views;Here可以看c#中的方法。

标签: c# android visual-studio xamarin fragment


【解决方案1】:

Fragment 没有要替换的 ontouchevent。也许你可以使用这个链接How to handle Touch Events on a Fragment?

【讨论】:

  • 嗨。我试试你给我的例子。但仍然无法正常工作。我把覆盖放在 view.setontouchlistener 里面。但仍然得到错误说没有找到合适的方法来覆盖:3
【解决方案2】:

这个link 正在使用java。翻译成c#后应该是这样的:

using Android.App;
using Android.OS;
using Android.Util;
using Android.Views;

namespace FragmentTest
{
    public class Fragment1 : Fragment,View.IOnTouchListener
    {
        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Create your fragment here
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            // Use this to return your custom view for this Fragment
            var view = inflater.Inflate(Resource.Layout.layout1, container, false);
            view.SetOnTouchListener(this);
            return view;

            
        }

        public bool OnTouch(View v, MotionEvent e)
        {
            if (e.Action == MotionEventActions.Move){
                //do something 
                Log.Error("lv","MOVE++++++++++++++++++");
                }

            return true;
        }
    }
}

效果很好。

因为Fragment中没有OnTouchEvent方法,所以需要我们自己实现。或者还有另一种方式,定义一个接口,使用dispatchTouchEvent方法,比上面的代码复杂。

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 2022-08-18
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多