android – 在ListView中获取绝对视图位置

前端之家收集整理的这篇文章主要介绍了android – 在ListView中获取绝对视图位置前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图让一个弹出窗口出现在ListView内部单击的项目上方/下方.
然而,问题是从OnItemClick方法进入的View只给了我X& Y值相对于ListView本身.我还检查了ListView,这也给了我x = 0 y = 0,尽管它上面还有其他视图.

我遍历了hierarchyviewer中的所有值,但没有看到我正在寻找的值. (而不是我在重新开始工作时遇到重大问题).

有什么建议?

@Override
public void onListItemClick(ListView listView,View view,int position,long id) {
    LayoutInflater inflater = getLayoutInflater(null);
    PopupWindow quickRail = new PopupWindow(
            inflater.inflate(R.layout.quanitity_controls,null),view.getMeasuredWidth(),view.getMeasuredHeight());

    int[] location = {
            0,0
    };

    // This doesn't place this window right on top of the view
    quickRail.showAtLocation(view,Gravity.CENTER,location[1]);
}

列表中的两个项目都使Popup出现在同一个位置.

解决方法

这应该工作
//Activity windows height
int totalHeight = getWindowManager().getDefaultDisplay().getHeight();
int[] location = new int[2];
v.getLocationOnScreen(location);

位置数组应具有视图的x和y值.
‘v’是onItemClickListener上传递的视图对象.

添加了一些我用于项目的部分.它可能会有所帮助.我在listview的顶部有一个操作栏,这段代码似乎运行正常.

要求是在列表项的顶部或下方放置一个小菜单.因此,当选择一个项目时,我检查所选列表项是否在屏幕的上半部分,如果是这样,则将菜单放在列表项目下面,否则将其放在列表项目的顶部.
这是代码

ListItem单击代码

listView.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent,long id) {
        showQuickActionMenu(position,view);
    }   
});

private void showQuickActionMenu(int pos,View v){
    LayoutInflater inflater = 
            (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    //This is just a view with buttons that act as a menu.  
    View popupView = inflater.inflate(R.layout.ticket_list_menu,null);
    popupView.findViewById(R.id.menu_view).setTag(pos);
    popupView.findViewById(R.id.menu_change_status).setTag(pos);
    popupView.findViewById(R.id.menu_add_note).setTag(pos);
    popupView.findViewById(R.id.menu_add_attachment).setTag(pos);

    window = PopupHelper.newBasicPopupWindow(TicketList.this);
    window.setContentView(popupView);
    int totalHeight = getWindowManager().getDefaultDisplay().getHeight();
    int[] location = new int[2];
    v.getLocationOnScreen(location);

    if (location[1] < (totalHeight / 2.0)) {
        PopupHelper.showLikeQuickAction(window,popupView,v,getWindowManager(),PopupHelper.UPPER_HALF);
    } else {
        PopupHelper.showLikeQuickAction(window,PopupHelper.LOWER_HALF);
    }   
}

这是我使用的PopupHelper类

public class PopupHelper {
    public static final int UPPER_HALF = 0;
    public static final int LOWER_HALF = 1;

    public static PopupWindow newBasicPopupWindow(Context context) {
        final PopupWindow window = new PopupWindow(context);

        // when a touch even happens outside of the window
        // make the window go away
        window.setTouchInterceptor(new OnTouchListener() {
            public boolean onTouch(View v,MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                    window.dismiss();
                    return true;
                }
                return false;
            }
        });

        window.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
        window.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
        window.setTouchable(true);
        window.setFocusable(true);
        window.setOutsideTouchable(true);

        window.setBackgroundDrawable(
                new ColorDrawable(android.R.color.darker_gray));        
        return window;
    }

    /**
     * Displays like a QuickAction from the anchor view.
     * 
     * @param xOffset
     *            offset in the X direction
     * @param yOffset
     *            offset in the Y direction
     */
     public static void showLikeQuickAction(PopupWindow window,View root,View anchor,WindowManager windowManager,int xOffset,int yOffset,int section) {

         //window.setAnimationStyle(R.style.Animations_GrowFromBottomRight);

         int[] location = new int[2];
         anchor.getLocationOnScreen(location);

         Rect anchorRect = new Rect(location[0],location[1],location[0] + 
                 anchor.getWidth(),location[1] + anchor.getHeight());

         root.measure(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);

         int rootWidth = root.getMeasuredWidth();
         int rootHeight = root.getMeasuredHeight();

         int screenWidth = windowManager.getDefaultDisplay().getWidth();
         int screenHeight = windowManager.getDefaultDisplay().getHeight();

         int xPos = ((screenWidth - rootWidth) / 2) + xOffset;
         int yPos = anchorRect.top - rootHeight + yOffset;

         xPos = (screenWidth - rootWidth);
         if(section == UPPER_HALF){
             yPos = anchorRect.top + anchor.getMeasuredHeight();    
         } else {
             yPos = anchorRect.top - rootHeight;
         }
         window.showAtLocation(anchor,Gravity.NO_GRAVITY,xPos,yPos);
    }

}
原文链接:https://www.f2er.com/android/308927.html

猜你在找的Android相关文章