暂时/动态禁用 Viewpager 中的单个页面

2023-12-10

我有一个扩展的 FragmentPagerAdapter,它为 ViewPager 提供 3 个片段,给我 3 个页面,我可以在它们之间滑动,也可以使用添加到操作栏的选项卡来手动选择页面。

我想暂时禁止用户使用任一导航类型访问最终页面(禁用任何特定页面的更通用的解决方案也很有趣,但不是必需的)。然后,我将通过来自其中一个片段的回调来重新启用他们的访问。

我已经阅读了一些类似问题的答案,这些问题涉及通过重写 onTouchEvent 和 onInterceptTouchEvent 来不允许滑动,然后在其中使用一些自定义手势检测,甚至使用 beginFakeDrag() 的半解决方案。

我当前的解决方案只是在适配器中设置较小的项目计数,确保使用notifyDataSetChanged(),并在必要时将其更改回来。这些方法是否有任何优雅的替代方案,也许不需要更改数据集?

我还发现 ActionBar.Tab 没有 setEnable() 方法,大多数人建议删除该选项卡。有没有办法让选项卡保持可见但不可选择?我的方法是定义禁用哪个选项卡,并在用户选择禁用的选项卡时重新选择之前选择的选项卡。

Edit:我的目标是禁用 Tab 键切换和滑动到最后一页。


您肯定会想要创建自己的自定义 ViewPager 子类。我创建了一个简单的自定义ViewPager called CustomSwipePager它将在需要时处理阻塞的用户交互。

public class CustomSwipeViewPager extends ViewPager {

    private boolean mLastPageEnabled = false;
    private int mLastPageIndex = 0;

    public NoSwipeViewPager(Context context) {
        super(context);
    }

    public NoSwipeViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setLastPageEnabled(boolean enabled) {
        mLastPageEnabled = enabled;
    }

    public void setLastPageIndex(int index) {
        mLastPageIndex = index;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event){

        if(!mLastPageEnabled && getCurrentItem() >= (mLastPageIndex - 1)) {
            // Always return false to disable user swipes
            return false;
        }

        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if (!mLastPageEnabled && getCurrentItem() >= (mLastPageIndex - 1)) {
            // Always return false to disable user swipes
            return false;
        }

        return true;
    }
}

您需要在课堂上利用两种关键方法setLastPageEnabled() and setLastPageIndex()。您可以将最后一页索引设置为您需要的任何内容,在您的情况下,如果您有三个项目,则将其设置为 2。然后还可以使用setLastPageEnabled(false)禁用刷卡或重新启用使用setLastPageEnabled(true).

您可以将此自定义视图包含到您的布局中,如下所示:

<com.mypackage.CustomSwipeViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/custom_swipe_view_pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

最后在您的片段或活动中的适当位置引用它:

private CustomSwipeViewPager mPager;

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    mPager = (CustomSwipeViewPager) findViewById(R.id.custom_swipe_view_pager);
    mPager.setLastPageEnabled(false);
    mPager.setLastPageIndex(2);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

暂时/动态禁用 Viewpager 中的单个页面 的相关文章

  • 确定是否在已取得 root 权限的设备上运行

    我的应用程序具有某些功能 该功能只能在具有 root 权限的设备上运行 与其让此功能在使用时失败 然后向用户显示适当的错误消息 我更喜欢能够先默默地检查 root 是否可用 如果不可用 则首先隐藏相应的选项 有没有办法做到这一点 这是一个类
  • Whatsapp 在 Android 中共享音频文件时正在剪切音频文件

    我在共享格式不是 mp3 的音频文件时遇到问题 文件被共享 但长度较短 例如 如果文件有 10 秒 则仅共享 5 秒 如果我使用 mp3 格式 它会完全共享 但其他格式会出现问题 注意 该文件在其他应用程序 如Messenger 中共享没有
  • 如何使用 Android 版 Facebook 同步的联系人图片

    我的手机上安装了 Android 版 Facebook 它会自动将联系人列表中人员的 FB 个人资料图片同步到我的手机 我想在我访问的应用程序中使用这些图片ContactsContract PhoneLookup 我真的需要 Faceboo
  • 如何检测android中的颠倒方向?

    在我的 Android 应用程序中 我有全景图像 并且我使用 TYPE ORIENTATION 传感器根据手机运动旋转该图像 它对于横向和纵向都工作良好 这是旋转逻辑的代码 Override public void onSensorChan
  • 为网络和/或持久存储序列化 Android Bundle?

    我需要序列化一个全面的应用程序 游戏 状态 以便通过网络传输或保存到磁盘并在以后检索 当然 捆绑包用于在多个用例中保存 恢复状态 因此使用它们将是理想的选择 但是 由于某种原因 Bundle 不可序列化 寻找解决方案只发现了将 Bundle
  • Android Studio磁盘空间不足如何解决?

    我随机收到此错误 并且不确定为什么 Android Studio 的磁盘空间变低 Android Studio 系统目录分区磁盘空间不足 Update 此应用程序安装在运行 10 10 1 的 Mac 上 具有 251GB 内部存储和占用
  • Android 上通过 JSCH 的基本 SSH 连接

    作为来自此的用户question https stackoverflow com questions 14323661 simple ssh connect with jsch和这个tutorial http eridem net andr
  • 如何在 android-studio 0.3.6 中运行 Gradle 1.9?

    我只是花了一些时间尝试将现有的 android studio 项目从 gradle 1 8 迁移到 gradle 1 9 Final 昨天发布 但失败了19th Nov 我在这里阅读了大多数其他与 gradle 相关的帖子 但没有一个对我有
  • 从Asynctask返回结果

    如果我的 Android 应用程序中有这个后台工作文件 并且它从我的数据库获取数据 我如何将字符串 结果 传递给另一个类 后台工作人员连接到我的服务器 然后使用 php 连接到数据库 public class BackgroundWorke
  • 明文 HTTP 流量...不允许

    我的程序从用户那里获取一个 URL 因此它可以向互联网上的任何网站发出请求 我试图让这成为可能 我查找了有关 Android HTTP Cleartext 错误的所有答案 并做了这个 但它仍然不允许我连接我的测试本地 PHP 服务器 我在这
  • Android Things 文件系统

    我正在 Android 上构建这个应用程序 我希望能够让它访问 U 盘上的媒体文件 甚至树莓派的 SD 卡上的媒体文件 我还不知道我将如何处理这些文件 但我只是想知道它是否可能 如果不是这样也没关系 我还有其他解决方案 但我想我会先从明显的
  • 如何知道点击的widget id?

    我已经实施了一个widget与ImageButton and a TextView That ImageButton启动一个activity当它被点击时 这activity使用用户在活动上写入的内容更新小部件文本EditText 现在的问题
  • 来自外部 XML 的 Android 本地化

    是否可以使用从服务接收到的 XML 在运行时翻译 Android 应用程序 如果可能的话 请有人指出我正确的方向 谢谢 Warning 我读到的所有内容都表明 让您的应用程序更改语言不是一个好主意 因为 Android 框架不支持它 并且可
  • Android 依赖项:apklib 与 aar 文件

    据我了解 apklib包含代码 共享资源Maven aar文件由以下人员分发Gradle The aar与 apklib 的主要区别在于 类被编译并包含在 aar 根目录下的classes jar 中 然而apklib不能包含已编译的类文件
  • 使用startActivityForResult,如何获取子活动中的requestCode?

    我有四项活动 即 A B C 和 D 我的情况是A将通过startActivityForResult启动活动B startActivityForResult new Intent this B class ONE 在另一种情况下 我将使用不
  • 在Android的activity中调用onResume

    在活动的过程中通过调用 this OnResume 强制 onResume 事件可以吗 或者我应该实现另一个由 OnResume 和第一个成员调用的过程 实现在您的重写中调用的另一个过程onResume 后者不打算由您调用 它是一种方便的方
  • EditText 的高度不会扩展到其父级的高度

    我在滚动视图中放置了编辑文本 高度 match parent并期望它的高度等于滚动视图 但事实并非如此 它的高度就像wrap content这意味着如果 EditText 中没有文本 我必须将光标指向要弹出的软键盘的第一 行 我想要的是我可
  • Admob - 没有广告可显示

    你好 我尝试制作一些在 Android 手机上显示广告的示例程序 并尝试在 v2 2 的模拟器上测试它 代码中的一切似乎都很好 但调试器中的 AdListener 表示 响应消息为零或空 onFailedToReceiveAd 没有广告可显
  • Android 中带有无尽列表视图滚动的 AsyncTask

    我正在创建一个应用程序 其中我需要有无限的滚动列表视图 我不想在我的应用程序中使用任何库 我在网上看到了一些有助于实现此类列表视图的示例 但我的疑问是 当我的数据来自服务器并在异步任务中进行解析时 如何才能拥有无尽的列表视图 如何从滚动异步
  • 将 firebase 消息传递添加到 flutter android 项目时出现依赖错误

    我已将 firebase 消息传递添加到我的 Flutter 项目中 在 iOS 上运行良好 在 Android 上运行时出现错误 Android dependency androidx localbroadcastmanager loca

随机推荐

  • MVC 3 - 模型绑定表中的列表,每个记录是一列而不是行

    我可以找到有关如何在 MVC 3 中模型绑定项目列表的各种文章 甚至可以在表中进行模型绑定 但在每个示例中 行代表列表中的一条记录 我的观点的要求是每条记录必须是一列 我无法从以下文章中获得任何技巧 http blog stevensand
  • 根据列表中的条件合并列表项

    我有一个项目清单 例如 a IP 123 84 apple mercury IP 543 65 killer parser goat IP 549 54 pineapple django python 我想根据条件合并列表项 即合并所有项目
  • iOS:如何关闭弹出窗口[重复]

    这个问题在这里已经有答案了 可能的重复 如何关闭故事板弹出窗口 我有一个 iPad 故事板 将一个视图中的栏按钮项按住 Control 键拖动到另一个视图 并选择弹出框样式 当我按下按钮时 新的弹出窗口视图将显示在弹出窗口中 但我有两个问题
  • 使用 Java 中的 ImageIO 编写 TIFF 的平铺输出

    我拥有的是大量的帧 需要将它们放在一起形成更大的图像 如马赛克 所需的图像位置是已知的 图像数量非常多 因此将它们全部加载到内存中是不切实际的 根据这里的一些其他答案 我能够覆盖 RenderedImage 中的方法 特别是getData
  • 厨师食谱中使用了哪些 ruby​​ 功能?

    我刚开始使用 Chef 对 ruby 不太了解 我无法理解食谱中使用的语言语法 比如说 我在食谱中的recipes default rb 中创建一个目录 如下所示 directory home test mydir do owner tes
  • 确定 C++ 应用程序是否作为 UWP 应用程序运行并具有旧版支持

    我的第一个想法是使用GetPackageFamilyName 并寻找ERROR SUCCESS vs APPMODEL ERROR NO PACKAGE 但是 我需要支持 Windows 7 这使得GetPackageFamilyName
  • jQuery validate - 如何防止自动提交?

    我热衷于使用 jQuery 验证器插件来验证我的代码 但我想禁用自动提交表单 我宁愿自己使用 jQuery 发送它 post method 事实上 考虑到我的按钮不是类型 我不太确定为什么要提交表单submit但只是
  • java进程间通信

    是否可以使用在命令行中运行java类来运行正在运行的swing中的某个类或函数 例如 当java Test asd将setText一个正在运行的swing Jlabel设置为asd 这两个程序在不同的进程中运行 您需要在进程之间创建一个接口
  • 在正则表达式中获取非法字符范围:java

    我有一个简单的正则表达式模式来验证名称 但是当我运行它时 我收到非法字符范围错误 我认为通过转义 s 它将允许一个空格 但编译器仍然抱怨 public boolean verifyName String name String namePa
  • PHP 支持 MVP 模式吗?

    有很多使用 ASP NET 解释 MVP 模式的示例 但没有找到任何使用 PHP 的示例 我是 PHP 程序员 想知道在哪里可以获得 MVP 模式 PHP 示例 简短的回答是 是的 PHP 可以 Note its not exactly M
  • 如何在 JavaScript 中换行?

    请告诉我如何在 JavaScript 中换行
  • 连接两个 Pandas DataFrame 同时保持索引顺序

    基本问题 我试图连接两个 DataFrame 生成的 DataFrame 按原始两个的顺序保留索引 例如 df pd DataFrame Houses 10 20 30 40 50 Cities 3 4 7 6 1 index 1 2 4
  • 升级到rails 3.1.0后ActionView::Template::Error(参数数量错误(1代表0))与atom_feed

    我刚刚将 Rails 应用程序从 3 0 7 版本升级到候选版本 3 1 0 我的 Atom feed 构建器中出现了一个奇怪的错误 ActionView Template Error wrong number of arguments 1
  • WPF/Metro 风格:使 ListView 只显示完整的项目

    在我的 Metro 应用程序中 我有一个包含一定数量项目 例如 25 个 的数据源 我有一个显示这些项目的 ListView 我的问题是 ListView 的大小允许它显示 6 5 个项目 因此它显示的最后一个项目被切成两半 如果分辨率改变
  • 如何在asp.net web应用程序中调用javascript方法

    我想在 C 函数中使用 javascript 函数 protected void button1 Click object sender EventArgs e javascript function call ex boolean b t
  • 为什么 JS 允许在数组中使用负索引?

    为什么 JS 中数组的负索引不会引发错误 看起来它不打算在数组中包含具有负索引的元素 array length不计算具有负索引的元素 array forEach 不会迭代具有负索引的元素 UPD 问题不是 为什么它在技术上是可能的 而是 为
  • Java 可选映射和 orElse 的链接(if-else-style)

    Java 中是否有一种优雅且流式的方式来表示 如果该值存在 则将此可选值映射到另一个带有计算值的可选值 否则返回一个空的可选值 我想到了类似的事情 Optional
  • 使用 USING 进行 SQL 连接:<列名称> 不是可识别的表提示选项

    我有以下加入 SELECT FROM tableA INNER JOIN tableB USING commonColumn 我收到错误 commonColumn 不是可识别的表提示选项 如果是 用作表值函数或 CHANGETABLE函数
  • Cayenne 3.1 - 动态设置数据源

    我目前使用 Cayenne 3 1B2 作为某些 Web 服务的持久层 服务需要公开多个数据库之一 所有数据库都具有相同的架构 在调用服务操作时确定数据库 使用哪个数据库的决定需要基于调用服务的客户端的身份 我将如何定义它并在运行时使用它
  • 暂时/动态禁用 Viewpager 中的单个页面

    我有一个扩展的 FragmentPagerAdapter 它为 ViewPager 提供 3 个片段 给我 3 个页面 我可以在它们之间滑动 也可以使用添加到操作栏的选项卡来手动选择页面 我想暂时禁止用户使用任一导航类型访问最终页面 禁用任