我们选择做这些事并不是因为它们很容易,而是因为它们很难。因为如果我不能这样做,我的用户界面就会被解开。

将下面给出的NavigationItemLongPressInterceptor类导入到您的项目中。

NavigationView的菜单项声明为正常,另外两个属性用于添加长按行为。

xmlns:app="http://schemas.android.com/apk/res-auto"

tools:showIn="navigation_view">

android:id="@+id/nav_item_1"

android:icon="@drawable/ic_item_1"

android:title="Item 1"

android:checkable="true"

app:actionViewClass=

"com.twoplay.netplayer.controls.NavigationItemLongPressInterceptor"

app:showAsAction="always"

/>

android:id="@+id/nav_item_2"

android:icon="@drawable/ic_item_2"

android:title="Item 2"

android:checkable="true"

app:actionViewClass=

"com.twoplay.netplayer.controls.NavigationItemLongPressInterceptor"

app:showAsAction="always"

/>

将NavigationItemLongPressInterceptor.OnNavigationItemLongClickListener的实现添加到您的活动,并实现onNavigationItemLongClick方法:

public class MainActivity extends MediaActivity

implements

NavigationView.OnNavigationItemSelectedListener,

NavigationItemLongPressInterceptor.OnNavigationItemLongClickListener

. . .

@Override

public void onNavigationItemLongClick(

NavigationItemLongPressInterceptor.SelectedItem selectedItem,

View view)

{

// supply your NavigationView as an argument.

int menItemId = selectedItem.getItemId(mNavigationView);

switch (id) {

...

case R.id.nav_local_device:

case R.id.nav_upnp_devices: {

showNavigationItemSetAsHomePopupMenu(id,view);

}

break;

}

}

}

您可能需要将com.twoplay.netplayer.controls.NavigationItemLongPressInterceptor添加到您的proguard规则中。

navigation item long press interceptor.Java:

package com.twoplay.netplayer.controls;

import android.app.Activity;

import android.content.Context;

import android.content.ContextWrapper;

import android.util.AttributeSet;

import android.view.Menu;

import android.view.MenuItem;

import android.view.SubMenu;

import android.view.View;

import android.view.ViewGroup;

import com.google.android.material.navigation.NavigationView;

import androidx.annotation.Nullable;

/**

* Attach a long-click handler to a menu item in a NavigationView menu.

*

* To handle long-click of a Navigator menu item, declare the item as normal, and append

* app:actionViewClass="com.twoplay.netplayer.controls.NavigationItemLongPressInterceptor" and

* app:showAsAction="always" attributes:

*

*

* xmlns:app="http://schemas.android.com/apk/res-auto"

* >

*

*

*

* android:id="@+id/nav_item_1"

* android:icon="@drawable/ic_item_1"

* android:title="Item 1"

* android:checkable="true"

* app:actionViewClass=

* "com.twoplay.netplayer.controls.NavigationItemLongPressInterceptor"

* app:showAsAction="always"

*

*

*

* Your Application class must implement

* in order to receive notification of long pressed menu items.

*

* You can retrieve the item id of the menu by calling on the

* provided as an arguement to

*

* />

*

*/

@SuppressWarnings("unused")

public class NavigationItemLongPressInterceptor extends View {

public NavigationItemLongPressInterceptor(Context context) {

super(context);

init();

}

public NavigationItemLongPressInterceptor(Context context, @Nullable AttributeSet attrs) {

super(context, attrs);

init();

}

public NavigationItemLongPressInterceptor(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

init();

}

private void init()

{

setVisibility(View.INVISIBLE);

setLayoutParams(new ViewGroup.LayoutParams(0,0));

}

public interface OnNavigationItemLongClickListener {

void onNavigationItemLongClick(SelectedItem itemHandle, View view);

}

public static class SelectedItem {

private final View actionView;

private SelectedItem(View actionView) {

this.actionView = actionView;

}

public int getItemId(NavigationView navigationView)

{

return getItemId(navigationView.getMenu());

}

private int getItemId(Menu menu) {

for (int i = 0; i < menu.size(); ++i) {

MenuItem item = menu.getItem(i);

if (item.getActionView() == actionView) {

return item.getItemId();

}

SubMenu subMenu = item.getSubMenu();

if (subMenu != null) {

int itemId = getItemId(subMenu);

if (itemId != -1) {

return itemId;

}

}

}

return -1;

}

}

@Override

protected void onAttachedToWindow() {

super.onAttachedToWindow();

View parent = getMenuItemParent();

parent.setOnLongClickListener(new View.OnLongClickListener() {

@Override

public boolean onLongClick(View v) {

OnNavigationItemLongClickListener receiver = getReceiver();

if (receiver == null)

{

throw new RuntimeException("Your main activity must implement NavigationViewLongPressInterceptorView.OnNavigationItemLongClickListener");

}

View parent = getMenuItemParent();

receiver.onNavigationItemLongClick(

new SelectedItem(NavigationItemLongPressInterceptor.this),parent);

return true;

}

});

}

private Activity getActivity() {

Context context = getContext();

while (context instanceof ContextWrapper) {

if (context instanceof Activity) {

return (Activity)context;

}

context = ((ContextWrapper)context).getBaseContext();

}

return null;

}

private OnNavigationItemLongClickListener getReceiver() {

Activity activity = getActivity();

if (activity == null) return null;

if (activity instanceof OnNavigationItemLongClickListener)

{

return (OnNavigationItemLongClickListener)activity;

}

return null;

}

private View getMenuItemParent() {

View parent = (View)getParent();

while (true)

{

if (parent.isClickable())

{

return parent;

}

parent = (View) parent.getParent();

}

}

}

此代码针对androidx,但它可以简单地向后移植到AppCompat。只需删除androidx导入,并将其替换为相应的AppCompat导入。希望旧版本的NavigationView以同样的方式布置actionViews。

使用'androidx.appcompat:appcompat:1.0.2','com.google.android.material:material:1.0.0'进行测试。我有理由相信它是版本安全的。如果getMenuItemParent()needs调整其他AppCompat版本,请告诉我,我将在此处纳入更改。

java长按底栏_java - 如何在导航抽屉物品中添加长按功能? - SO中文参考 - www.soinside.com...相关推荐

  1. 另一个.java文件调用_java - 如何调用另一个类“写文件”的方法? - SO中文参考 - www.soinside.com...

    在我的Android应用程序,我想有一类处理所有"写入/读取到文本文件"的行动.所以,我根本就调用我的readUserFile.java文件我想的方法.但我的方法将不会在该文件中工 ...

  2. java lifo 队列_java - 如何在LIFO模式下实现链接的阻塞队列 - SO中文参考 - www.soinside.com...

    如何在LIFO模式下实现链接的阻塞队列 问题描述 投票:0回答:1 标题已经说明了一切,在我的代码中,我有一个实现链接阻止队列并提供在队列中插入和获取元素的方法的对象,我希望从队列中进行插入/提取. ...

  3. java模拟滑动事件_java - 以编程方式在Android视图中触发滑动动作事件 - SO中文参考 - www.soinside.com...

    我正在尝试以编程方式触发视图中的滑动.还有其他问题的答案,但他们没有为我工作.我还看到一些comments表示程序化的拖动/滚动因安全原因被禁用,这是真的吗?我很想找到一个明确的答案. 我尝试了以下方 ...

  4. java实体中文字段_java - Spring JPA实体类是否可以包含不在数据库表中的非数据库字段 - SO中文参考 - www.soinside.com...

    我在SpringBoot中使用Spring JPA和Spring Data Rest.我有一个称为用户的数据库表和该表的实体.我没有此应用程序的控制器.@Entity @Table(name = &q ...

  5. java dom获取命名空间属性_java – 如何在XML DOM对象中添加命名空间前缀?

    我正在尝试使用特定的命名空间来构建一个 XML文档.我想要生成的最终文档应该是这样的: token token token 这是我到目前为止. Document document = Document ...

  6. 最长不重复字符串python_Python简单实现查找一个字符串中最长不重复子串的方法...

    本文实例讲述了Python简单实现查找一个字符串中最长不重复子串的方法.,具体如下: 刚结束的一个笔试题,很简单,不多说简单贴一下具体的实现: #!usr/bin/env python #encodi ...

  7. python找到一行单词中最长的_python - 查找.txt文件中最长的单词,不带标点符号 - SO中文参考 - www.soinside.com...

    我正在做Python文件I / O练习,尽管在尝试查找.txt文件每一行中最长的单词的练习上取得了巨大进步,但我无法摆脱标点符号.] > 这是我的代码:with open("origi ...

  8. 如何用Java制作hwid验证_java - 将帐户登录+ HWID锁定添加到Java程序的最安全方法是什么? - SO中文参考 - www.soinside.com...

    是的,你可以做到,但你需要重新设计你的应用程序.您应该将应用程序分成两个不同的应用程序.(简而言之:您还有很长的路要走) 1-客户端应用程序:Java应用程序与最终用户交互的位置. 2-服务器应用程序 ...

  9. 用java程序写一个闹钟_java 使用swing制作一个小闹钟,包含以下功能:

    展开全部 import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.Font; import java.awt ...

  10. java游戏移动_java - Java游戏 - 如何让敌人移动? - SO中文参考 - www.soinside.com

    Java游戏 - 如何让敌人移动? 问题描述 投票:1回答:2 我正在做一个射击游戏,并添加了许多带阵列的敌人,然后在地图上给他们一个随机位置,但我不知道如何让他们在到达他们的位置后移动.这是我的敌人 ...

最新文章

  1. 【Python3爬虫】最新的12306爬虫
  2. C#跑马灯,图片滚动,后台获取图片地址。动态绑定图片,imag显示文字
  3. jsp mysql utf8_jsp操作mysql存取中文乱码
  4. C# StopWatch的BUG????
  5. NYOJ 179 LK's problem
  6. 树和而叉查找树的实现
  7. QT的QStorageInfo类的使用
  8. 创建订单 - 填充新订单数据
  9. 多线程与高并发(七):详解线程池 - 自定义线程池,JDK自带线程池,ForkJoin,源码解析等
  10. java excel 操作 poi_Java使用apache poi进行excel相关操作
  11. 程序员幽默趣图(动物篇)
  12. mysql+nest+嵌套事务_MySQL——事务
  13. DPABI advanced edition 文件夹组织形式
  14. 安全小测试:介绍一个简单web安全知识测试的网站
  15. struts2源码分析-初始化流程
  16. weblogic8.1在myeclipse中启动正常,在单独的weblogic中无法正常启动的解决方案.
  17. 微信小程序云开发视频教程上线啦
  18. Java中instanceof关键字的作用
  19. Android基础入门教程——9.2 MediaPlayer播放音频与视频
  20. php script是什么,script是什么意思

热门文章

  1. php web长时间不操作退出,Ecshop管理员登陆后台后短时间不操作自动退出的解决方法...
  2. java怎么加载主类_Java编写过程中遇到无法加载主类该怎么解决?
  3. JSONP原理及使用
  4. mac使用php-version切换PHP版本
  5. 类的使用---进阶编程篇(四)
  6. 画图解释 SQL join 语句
  7. [POJ2796]Feel Good
  8. 在ubuntu下安装和配置vsftpd
  9. Netty之Channel、NioEventLoopGroup、客户端connect方法总结
  10. 安装RabbitMQ无法访问(http://localhost:15672)解决方案