gpt4 book ai didi

android - 如何在 MenuItem 上(在 NavigationView 上)设置长按监听器?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:44:10 25 4
gpt4 key购买 nike

如何在 MenuItem 上设置长按监听器?

我试过了 this answer ,但该方法对我来说不存在。有什么解决办法吗?

代码:

Menu menu = navigationView.getMenu();
MenuItem menuItem = menu.findItem(R.id.menu_item);

// TODO set a long click listener on the menuItem.
menuItem.setOnLongClickListener(...); // Method does not exist, any other solutions?

编辑:我不想设置自定义 ActionView,我希望长按监听器监听整个 MenuItem,而不需要自定义 View 。

最佳答案

许多方法之一(假设我们使用工具栏)- 这个例子应该让您了解如何实现工具栏按钮上的长按:

class MyActivity extends Activity {    

@Override
public boolean onCreateOptionsMenu(Menu menu) {
/** get menu inflater */
MenuInflater menuInflater = getMenuInflater();
/** Inflate the menu
* this adds items to the action bar if it is present. */
menuInflater.inflate(R.menu.menu_home, menu);
/** find interesting item */
MenuItem item = menu.findItem(R.id.itemId);
/** set action view */
item.setActionView(new ImageButton(this)); // this is a Context.class object
/** set listener on action view */
item.getActionView().setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
});

return super.onCreateOptionsMenu(menu);
}
}

在方法 onCreateOptionsMenu - 或任何其他可以获得菜单项引用的方法中(省略步骤 1-2):

  1. 创建菜单/例如通过inflate
  2. 获取菜单项
  3. 创建 Action View ,例如 ImageButton
  4. 在 Action View 上设置长按监听器
  5. 在菜单项上设置一个 Action View

上面我设置了一个 Action View 然后我从菜单项中取回它并设置监听器(顺序是不管它也可以这样):

ImageButton imageButton = new ImageButton(Context);
imageButton.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
});
item.setActionView(imageButton);

附言。您还可以将 xml 中的 ImageView 设置为菜单项的属性:

 <item
...
android:actionViewClass="android.widget.ImageButton"
/>

then you can get the action view by cast

View menuItemActionView = menu.findItem(R.id.itemId).getActionView();
if(menuItemActionView != null
&& ImageButton.class.isAssignableFrom(menuItemActionView.getCLass())) {
ImageButton imageButton = (ImageButton) menuItemActionView;
}

But then you set the long click listener to the action view only, not the whole item. – SuperThomasLab

-- 不,你在单个元素上设置 Action View 在这种情况下,你更改菜单项的默认 View (到 ImageButton 小部件)- Action View 可以是简单或复杂的 View 类型

But what if u don't want to change the view, but keep the default view? – SuperThomasLab

示例(这是使用布局树观察器/设置布局更改监听器的许多方法之一):

    private View.OnLongClickListener onLongClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
};


@Override
public boolean onCreateOptionsMenu(Menu menu) {
/** get menu inflater */
MenuInflater menuInflater = getMenuInflater();
/** Inflate the menu
* this adds items to the action bar if it is present. */
menuInflater.inflate(R.menu.menu_home, menu);
/** geta menu item using findItem(int itemid) */
MenuItem item = menu.findItem(R.id.itemLogOut);
/** check if we have item */
if(item!=null) {
/** try get its action view */
View actionView = item.getActionView();
/** check if action view is already set? */
if(actionView==null) {
/** get item id to comparte later in observer listener*/
final int itemId = item.getItemId();
/** if not set on top most window an layout changes listener */
getWindow().getDecorView()
.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right,
int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
/** try get view by id we have stored few line up */
View viewById = v.getRootView().findViewById(itemId);
/** check if we have any result */
if(viewById!=null) {
/** set our listener */
viewById.setOnLongClickListener(onLongClickListener);
/** remove layout observer listener */
v.removeOnLayoutChangeListener(this);
}
}
});
} else {
/** if set we can add our on long click listener */
actionView.setOnLongClickListener(onLongClickListener);
}
}
}

I tried the OnLayoutChangeListener, but it still doesn't work Nothing changed. – SuperThomasLab

是的 - 但我知道它在您的情况下不起作用的原因??? - 在我的示例中,我们检查是否布局了 View 项,而不是检查是否布局了菜单 View ,然后检查菜单是否包含项

这是供您学习的工作代码:

https://github.com/c3ph3us/LongClickOnMenuItem

回复其他评论:

@ SuperThomasLab It's not obvious for me why setOnLongClickListener(...) method is not available for you. – Hossein Seifi

@HosseinSeifi - 看看 android.view.MenuItem 接口(interface) - 它没有提供这样的方法 - 所以对于优秀的程序员来说这应该是显而易见的:)为什么他无法实现类方法.

关于android - 如何在 MenuItem 上(在 NavigationView 上)设置长按监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37899080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com