【问题标题】:Android popup - passing arguments to event handlersAndroid 弹出窗口 - 将参数传递给事件处理程序
【发布时间】:2016-10-06 00:41:29
【问题描述】:

我有一个带菜单的 NavigationView。 当任何菜单项被长按时,我会弹出一个弹出窗口,为用户提供各种选项/按钮。每个按钮都有一个事件处理程序。

我需要这些处理程序知道最初触发弹出窗口的是哪个菜单项。

我缺少的是如何在对象流中传递该身份的知识。

在发布的代码中,菜单项被长按,我将菜单项作为视图传递给弹出构造函数。 但是不知道如何将它传递给弹出按钮的事件处理程序。

我正在考虑作为替代方案,只需在长按发生时使用 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);
}

【问题讨论】:

    标签: android popup


    【解决方案1】:

    如果我的问题是正确的,您只需将点击的 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);
    }
    

    【讨论】:

    • 不幸的是,这不起作用,尽管我只是为了完整性而尝试。传入 onlongpress 的视图确实是菜单项。然而,传递给按钮事件的视图是按钮本身。
    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 2021-05-30
    相关资源
    最近更新 更多