微信小程序-tab导航栏横向滑动,对应详情长页锚点跳转

微信小程序Tab导航栏实现

示例

tab导航栏可以横向滑动,竖屏滑动到当前模块时对应的tab变色 图标更改  同时当前tab会跟随处于tab栏中间;点击tab时当前tab变色,锚点跳转到对应页面。

参考了别人大神的代码,tab带图标并能选中改变的没找到,自己做了修改。

 

参考的链接:https://www.cnblogs.com/xsffliu/p/11097846.html 感谢~

 

wxml部分:

1.导航

 <scroll-view class="tab" scroll-x scroll-left="{
  
  {tabScroll}}" scroll-with-animation="true">
                <view class='tab-item {
  
  {nowstatus == "productBox" ? "active" : ""}}' bindtap="toViewClick" data-current="{
  
  {0}}" data-hash="productBox">
                  <image data-current="{
  
  {0}}" data-hash="productBox"  wx:if="{
  
  {currentTab == 0}}" src="../../image/lx-icon/zdrypf-xz.png" class="img"></image>
                  <image data-current="{
  
  {0}}" data-hash="productBox" wx:else src="../../image/lx-icon/zdrypf-wxz.png" alt="" class="img"></image>
                    导航1
                </view>
                <view class='tab-item {
  
  {nowstatus == "commentBox" ? "active" : ""}}' bindtap="toViewClick" data-current="{
  
  {1}}" data-hash="commentBox">
                    <image data-current="{
  
  {1}}"  data-hash="commentBox" wx:if="{
  
  {currentTab == 1}}" src="../../image/lx-icon/cpws-xz.png" class="img"></image>
                    <image data-current="{
  
  {1}}" data-hash="commentBox" wx:else src="../../image/lx-ico
<think> 由于用户要求对“Block”菜单项添加击处理,并且使用跳转距离(即通过菜单项位置处理),需要取消注释并完善`popupWindow.setOnItemClickListener`中的逻辑。 在`showPopupMenuForItem`方法中,已经有一个被注释的`setOnItemClickListener`,我们只需要取消注释并实现`handleMenuSelection`方法即可。 根据用户需求,当击菜单项时,需要根据菜单项的位置(menuPosition)来执行不同的操作。当前菜单项有两个:"Block"和"Delete"(当isOnline为false时出现)。 因此,在`handleMenuSelection`方法中,我们可以根据menuPosition来判断击的是哪一个菜单项。 步骤: 1. 取消注释`popupWindow.setOnItemClickListener`部分。 2. 在击事件中,调用一个方法(例如`handleMenuSelection`)来处理菜单选择,该方法需要三个参数:当前面位置(currentPagePosition,在Activity中已定义)、按的item位置(itemPosition)和击的菜单位置(menuPosition)。 3. 在`handleMenuSelection`方法中,根据menuPosition执行不同的操作。 但是,请注意,在`showPopupMenuForItem`方法中,我们并没有传递`currentPagePosition`,而是通过Activity的成员变量`currentPagePosition`获取(根据之前代码,该变量在面切换时更新)。因此,在击事件中可以直接使用。 修改后的`showPopupMenuForItem`方法: ```java public void showPopupMenuForItem(View v, int itemPosition, boolean isOnline) { List<TPSimplePopupMenuItem> menuItems = new ArrayList<>(); menuItems.add(new TPSimplePopupMenuItem("Block", R.drawable.ic_block_black)); if(!isOnline) { menuItems.add(new TPSimplePopupMenuItem("Delete", R.drawable.ic_delete_24)); } TPListPopupWindow popupWindow = new TPListPopupWindow(this, v); popupWindow.setAdapter(new TPSimplePopupAdapter(this, menuItems)); popupWindow.setDropDownGravity(Gravity.END); // 添加菜单击处理 popupWindow.setOnItemClickListener((parent, view1, menuPosition, id) -> { handleMenuSelection(currentPagePosition, itemPosition, menuPosition); popupWindow.dismiss(); }); popupWindow.show(); } ``` 然后,我们需要实现`handleMenuSelection`方法,例如: ```java private void handleMenuSelection(int pagePosition, int itemPosition, int menuPosition) { // 根据pagePosition可以知道是主网络还是访客网络 // menuPosition: 0代表Block, 1代表Delete(当存在时) if (menuPosition == 0) { // 处理Block操作 blockItem(pagePosition, itemPosition); } else if (menuPosition == 1) { // 处理Delete操作 deleteItem(pagePosition, itemPosition); } } ``` 最后,实现`blockItem`和`deleteItem`方法,这两个方法需要根据业务逻辑编写。 注意:如果菜单项数量会变化(例如有时有Delete有时没有),那么menuPosition需要根据菜单项列表(menuItems)的实际顺序来确定。 另外,由于Block菜单项始终存在,所以menuPosition=0一定是Block。当isOnline为false时,menuPosition=1是Delete。 这样,当用户按某个设备项并选择Block时,就会触发blockItem方法。 如果用户希望击Block后跳转到另一个面,可以在`blockItem`方法中实现跳转逻辑,例如使用Intent。 §§相关问题§§ 1. 如何自定义PopupWindow的样式和布局? 2. 在PopupWindow中处理击事件有哪些注意事项? 3. 如何根据不同的网络类型(主网络/访客网络)执行不同的Block操作? 4. 如何确保PopupWindow在屏幕旋转时不会崩溃? 5. 如果菜单项需要动态变化(如根据设备状态显示不同菜单),应该如何设计? </think> 为了在 `showPopupMenuForItem` 方法中为 "Block" 菜单项添加击处理,同时使用击位置(菜单项索引)进行区分,可以按照以下步骤实现: ### 完整解决方案代码: ```java public void showPopupMenuForItem(View v, int itemPosition, boolean isOnline) { List<TPSimplePopupMenuItem> menuItems = new ArrayList<>(); menuItems.add(new TPSimplePopupMenuItem("Block", R.drawable.ic_block_black)); if(!isOnline) { menuItems.add(new TPSimplePopupMenuItem("Delete", R.drawable.ic_delete_24)); } TPListPopupWindow popupWindow = new TPListPopupWindow(this, v); popupWindow.setAdapter(new TPSimplePopupAdapter(this, menuItems)); popupWindow.setDropDownGravity(Gravity.END); // 添加菜单击处理 popupWindow.setOnItemClickListener((parent, view1, menuPosition, id) -> { // 通过菜单位置区分击项 if (menuPosition == 0) { // "Block" 是第一个菜单项 handleBlockAction(itemPosition, isOnline); } else if (menuPosition == 1) { // "Delete" 是第二个菜单项 handleDeleteAction(itemPosition, isOnline); } popupWindow.dismiss(); }); popupWindow.show(); } // 处理 Block 操作 private void handleBlockAction(int devicePosition, boolean isOnline) { // 根据位置获取设备信息(需补充获取数据的方法) ClientItem device = getDeviceByPosition(devicePosition, isOnline); // TODO: 实现实际业务逻辑 Log.d("ACTION", "Block device: " + device.getName()); Toast.makeText(this, "Blocking " + device.getName(), Toast.LENGTH_SHORT).show(); // 示例:跳转到设备详情 Intent intent = new Intent(this, DeviceDetailActivity.class); intent.putExtra("DEVICE_ID", device.getId()); startActivity(intent); } // 处理 Delete 操作 private void handleDeleteAction(int devicePosition, boolean isOnline) { ClientItem device = getDeviceByPosition(devicePosition, isOnline); Log.d("ACTION", "Delete device: " + device.getName()); // TODO: 实现删除逻辑 } // 根据位置获取设备(示例方法) private ClientItem getDeviceByPosition(int position, boolean isOnline) { // 需要根据当前网络类型获取对应数据源 List<ClientItem> dataSource = isOnline ? onlineDevices : offlineDevices; return dataSource.get(position); } ``` ### 关键实现要: 1. **菜单项击识别**: - `menuPosition` 参数自动对应菜单项添加顺序 - 索引 0=第一个菜单项("Block"),1=第二个菜单项("Delete") 2. **业务逻辑分离**: - 创建专门的 `handleBlockAction()` 处理 Block 操作 - 创建 `handleDeleteAction()` 处理 Delete 操作 - 通过 `itemPosition` 和 `isOnline` 定位具体设备 3. **设备数据获取**: - 添加 `getDeviceByPosition()` 方法根据位置获取设备对象 - 需区分在线/离线设备列表(根据实际数据结构调整) 4. **跳转示例**: - 在 `handleBlockAction()` 中添加跳转详情的 Intent 示例 - 使用 `putExtra()` 传递设备 ID ### 注意事项: 1. 确保 `onlineDevices/offlineDevices` 数据源已正确初始化 2. 如果菜单项动态变化,需使用菜单标题判断而非固定索引 3. 添加防抖处理避免快速多次击 4. 考虑添加加载状态(如击后显示进度条)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值