我有一个带菜单的NavigationView。 当长按任何菜单项时,我会弹出一个弹出窗口,为用户提供各种选项/按钮。每个按钮都有一个事件处理程序。
我需要那些处理程序才能知道哪个menuitem最初触发了弹出窗口。
我缺少的是如何沿着对象流传递该身份的知识。
在发布的代码中,菜单项是longclicked,我将menutem作为视图传递给弹出构造函数。 但是不知道如何将它传递给弹出式Button的事件处理程序。
我正在考虑作为替代方案,只需在longpress发生时设置带有id的变量,然后在最终处理程序中再次读取该变量....但这确实感觉像是作弊而需要管理以确保与事件同步。
@Override
public boolean onLongClick(View v) {
pop(v);
return true;
}
public void pop(View v){
LayoutInflater layoutInflater =
(LayoutInflater)getBaseContext()
.getSystemService(LAYOUT_INFLATER_SERVICE);
View popupView = layoutInflater.inflate(R.layout.popup, null);
final PopupWindow popupWindow = new PopupWindow(
popupView,
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
Button btnDismiss = (Button)popupView.findViewById(R.id.dismiss);
btnDismiss.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View vw) {
Toast.makeText(getApplicationContext(), "id of menuitem here", Toast.LENGTH_SHORT).show();
popupWindow.dismiss();
}
});
popupWindow.showAsDropDown(v, 50, -30);
}
答案 0 :(得分:0)
如果我的问题是正确的,你只需要将menuitem的id传递给pop方法,然后在Toast中显示该值。
在这种情况下,考虑到您可以将id值转换为字符串,您可以使用setTag()
和getTag()
:
@Override
public boolean onLongClick(View v)
{
v.setTag(place the id of menuitem tapped here);
pop(v);
return true;
}
public void pop(View v)
{
LayoutInflater layoutInflater =
(LayoutInflater)getBaseContext()
.getSystemService(LAYOUT_INFLATER_SERVICE);
View popupView = layoutInflater.inflate(R.layout.popup, null);
final PopupWindow popupWindow = new PopupWindow(
popupView,
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
Button btnDismiss = (Button)popupView.findViewById(R.id.dismiss);
btnDismiss.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View vw) {
Toast.makeText(getApplicationContext(), String.valueOf(v.getTag()), Toast.LENGTH_SHORT).show();
popupWindow.dismiss();
}
});
popupWindow.showAsDropDown(v, 50, -30);
}