Android 滑动更改片段不起作用

2023-12-10

我正在尝试制作一个应用程序,用户可以在其中滑动并更改他们在屏幕上看到的片段。我无法使用视图寻呼机,因为我希望用户能够永远滑动到不同的片段。这是我的片段中的探测器:

 class MyGestureDetector extends SimpleOnGestureListener {
            @Override
            public boolean onDown(MotionEvent e) {
            return true;
        }
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE & Math.abs(velocityX) > 10) {
                    left();
                }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE & Math.abs(velocityX) > 10) {
                    right();
                }

            return false;
        }
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY){
                  if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE & distanceX > distanceY) {
                    left();
                  }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE & distanceX > distanceY) {
                      right();
                  }
                return false;
            }
    }
    public void right(){
        mCallback.dateNumber(true);
        sportView.setText("Loading");
    }public void left(){
        mCallback.dateNumber(false);
        sportView.setText("Loading");
    }

在我的活动中,这是我添加的用于更改片段的侦听器:

                    @Override
            public void dateNumber(Boolean left_right) {
                //true == right
                //false == left
                if(left_right == false){
                    day = day + 1;
                    Fragment1 rightFragment = new Fragment1();
                    Bundle args = new Bundle();
                    args.putInt("day", day);
                    rightFragment.setArguments(args);

                    android.support.v4.app.FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                    transaction.replace(R.id.fragment_container, rightFragment);
                    transaction.addToBackStack(null);
                    transaction.commit();
                }else if(left_right == true){
                    day = day - 1;
                    Fragment1 leftFragment = new Fragment1();
                    Bundle args = new Bundle();
                    args.putInt("day", day);
                    leftFragment.setArguments(args);

                    android.support.v4.app.FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                    transaction.replace(R.id.fragment_container, leftFragment);
                    transaction.addToBackStack(null);
                    transaction.commit();
                }
                left_right = null;
            }

我知道滑动手势总是被识别,但有时新的片段不会打开。有谁知道为什么?


首先,您可以使用我的方法真正简化您的刷卡代码droid查询图书馆:

//global variables
private boolean isSwiping = false;
private SwipeDetector.Direction swipeDirection = null;
private View v;//set to the parent layout of the fragments.

//swipe-handling code
$.with(v).swipe(new Function() {
    @Override
    public void invoke($ droidQuery, Object... params) {
        if (params[0] == SwipeDetector.Direction.START)
            isSwiping = true;
        else if (params[0] == SwipeDetector.Direction.STOP) {
            if (isSwiping) {
                isSwiping = false;
                if (swipeDirection != null) {
                    switch(swipeDirection) {
                        case DOWN :
                            //TODO: Down swipe complete, so do something
                            break; 
                        case UP :
                            //TODO: Up swipe complete, so do something
                            break; 
                        case LEFT :
                            //TODO: Left swipe complete, so do something
                            break; 
                        case RIGHT :
                            //TODO: Right swipe complete, so do something (such as):
                            day++;
                            Fragment1 rightFragment = new Fragment1();
                            Bundle args = new Bundle();
                            args.putInt("day", day);
                            rightFragment.setArguments(args);

                            android.support.v4.app.FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                            transaction.replace(R.id.fragment_container, rightFragment);
                            transaction.addToBackStack(null);
                            transaction.commit();
                            break; 
                        default :
                            break; 
                    }
                }
            }
        }
        else {
            swipeDirection = (SwipeDetector.Direction) params[0];
        }
    }
});

您可以找到有关 Fragment 交易的更多信息here.

另外,考虑保留一个int offset跟踪的变量+/-从零偏移。例如,您可以从一个实例中获取已经实例化的片段ArrayList,然后只需替换掉那个mArrayList.get(offset),当向右猛击时,做offset++,以及向左滑动的“offset--”。

Edit

根据评论中的要求,此代码可用于处理滑动和子图像单击:

包括SwipeInterceptorView在你的主布局中(res/layout/main.xml):

<?xml version="1.0" encoding="utf-8"?>
<self.philbrown.SwipeInterceptorView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipe_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

</self.philbrown.SwipeInterceptorView>

您将需要有类变量:

SwipeInterceptorView view;//instantiated in onCreate
ImageView fragImage;//must be instantiated when the new Fragment is transitioned in

接下来,将以下组件包含在onCreate:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //set main view to the main layout
    setContentView(R.layout.main);
    //get a reference to the content view
    view = (SwipeInterceptorView) findViewById(R.id.swipe_view);
    //add Swiper
    view.setSwipeListener(new SwipeListener() {
        public void onUpSwipe(View v) {
            //TODO handle up swipe
        }
        public void onRightSwipe(View v) {
            //TODO handle right swipe
        }
        public void onLeftSwipe(View v) {
            //TODO handle left swipe
        }
        public void onDownSwipe(View v) {
            //TODO handle down swipe
        }
    });
    view.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return super.onTouch(v, event);
        }
    });
}

当包含 ImageView 的新 Fragment 过渡时,您需要引用它并更新滑动拦截器的 onTouch 方法:

fragImage = (ImageView) fragment/* references the now non-null, on-display fragment */.getView().findViewById(R.id.yourImageId);
int[] origin = new int[2];
fragImage.getLocationOnScreen(origin);
final Rect bounds = new Rect(origin[0], origin[1], fragImage.getRight(), fragImage.getBottom());
view.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public void onTouch(View v, MotionEvent event) {
        if (bounds.contains(event.getRawX(), event.getRawY())) {
            return false;//now clicks will be handled by the Image.
        }
        return v.onTouchEvent(event);
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 滑动更改片段不起作用 的相关文章

随机推荐

  • Angular 5 插入动态输入属性

    我想将动态属性插入到输入 html 标记中 但我不知道该怎么做 我从组件端得到了这段代码 import Component OnInit from angular core Component selector app transclusi
  • Web 套接字在 Firefox 12 中不工作

    Firefox 无法与服务器 ws 192 168 0 155 5555 socket server3 php 建立连接 document ready function if WebSocket in window alert not av
  • 将 jQuery 自动完成与 Flask 结合使用

    这个问题之前已经被问过 我想我已经做了我在那里看到的事情 但我真的不知道我做错了什么 我对 jQuery 了解不多 但我会尽力解释我想要做什么 我想根据数据库中的查询自动完成 所以我的模板中有这样的内容
  • 张量流构建错误

    我在构建 Tensorflow 1 1 0 时遇到此错误 Starting local Bazel server and connecting to it ERROR home bishal cache bazel bazel bishal
  • ASP.NET Core 5 和 6 JWT 身份验证始终抛出 HTTP 401 代码

    我想在 ASP NET Core 中实现基于 JWT 的安全性 目前我想要它做的就是读取按钮中的令牌 Html ActionLink Test Oper Home 授权标头并根据我的标准验证它们 我不知道错过了什么 但它总是返回 HTTP
  • 将 prop 从子级传递给父级 React

    In WeatherForecast组件我需要传递函数的返回值appColor进入财产 那么该财产来自WeatherForecast需要传入className of app成分 新的反应 不确定如何将属性从子级传递到组件 class Wea
  • 在webview中加载本地javascript?

    我正在用我自己的广告快速制作移动浏览器 我想运行脚本 我已经注入了 javascript 本地文件 但它在其他窗口中打开并覆盖 webview 内容 是否可以在 webview 页面中运行 javascript 代码 不在其他窗口中 仅在包
  • 列出 knitr 环境(在 R 块中使用 list2env 时出现 R-markdown 错误)

    编辑 我发现问题源于yaml代码 它来自于应用这个解决方案动态命名文件 我相信它创造了一个家长环境knitr代码 因此list2env造成意想不到的行为 需要明确的是 下面的代码在 R 中完美运行 我在用list2env with envi
  • Camera2 API - Android

    我正在尝试使用android提供的新相机api作为camera2 但 CameraManager manager CameraManager getActivity getSystemService Context CAMERA SERVI
  • 检查 JavaScript 中属性是否存在

    我是 JavaScript 新手 对鸭子类型的概念有点困惑 据我所知 我理解了这个概念 但这在我的想法中导致了一个奇怪的结果 我将用下面的例子来解释 我目前正在使用 jQuery Mobile 开发移动 Web 应用程序 有一次我捕捉到了v
  • 使用 has_one 和 Belongs_to 的嵌套路由和 form_for 以及模型

    如何使用嵌套路由映射 has one 模型 以及如何在 RESTful 数据库之后为 localhost 3000 users 1 profile new html erb 添加 form for 用户拥有一份个人资料 Models cla
  • 使用相同的 php 文件显示表单并接收表单数据

    我有一个生成表单的 php 页面 表单的操作属性是页面本身 用户提交表单后 将加载相同的页面 但这次设置了 POST 变量 因此页面运行另一个脚本来处理来自表单的传入数据 我通过使用条件分叉来做到这一点 if isset POST var
  • 获取断点检索地址簿数据

    我正在检索phoneNumbers我得到一个断点 我花了几个小时试图修复它 但仍然没有成功 void textMessage ABAddressBookRef addressBook ABAddressBookCreate NSMutabl
  • 编译器自动绑定(类型推断)泛型类型

    以下代码在 t3 行有编译错误 public
  • 通过递归 CTE 使用 SQLAlchemy 获取层次结构的顶级父 ID

    我有这样一个案例 Note table id parent id 1 Null 2 1 3
  • 为什么条件运算符是右结合的?

    我可以理解为什么赋值运算符是右结合的 这是有道理的 当 x 4 3 求值时 4 和 3 在分配给 x 之前相加 我不清楚如何 将从右结合中受益 只有当两个人在一起时才重要吗 s 是这样使用的 z a b a b c d 那么它的评估是这样的
  • 我们如何在 wpf 中的文本框上进行整数验证

    我正在制作一个 Wpf 应用程序 我想对整数和字符文本框进行验证 我怎样才能实现它 当值超出范围时 您可以抛出异常并使用 ValidationRules 如下所示
  • “?” 是什么意思?和“:”在布尔语句中做什么? [复制]

    这个问题在这里已经有答案了 我认为这个问题是一个通用的编程问题 但假设我要为 Java 请求这个 下面的语句有什么作用 return a b c b c 我看过语法 s and 在许多主题中都有 我在其中找到了这个特定的主题检查三个布尔值中
  • CSS 全页宽度水平菜单和水平子菜单

    我正在尝试为我正在开发的网站创建一个解决方案 其中菜单和子菜单水平居中 但 div 延伸到整个页面宽度 首先 这是一个 HTML 示例 div class full width div
  • Android 滑动更改片段不起作用

    我正在尝试制作一个应用程序 用户可以在其中滑动并更改他们在屏幕上看到的片段 我无法使用视图寻呼机 因为我希望用户能够永远滑动到不同的片段 这是我的片段中的探测器 class MyGestureDetector extends SimpleO