如何在其上绘制Spinner下拉视图或下拉列表中的某个项目的视图?

时间:2017-05-18 15:48:47

标签: android view android-spinner dropdown

我需要产品小组获取当前打开的Spinner下拉视图的实例,然后在其中一个下拉项目之上更改或显示Showcase。在这里讨论了一些问题和其他类似的文章之后:

Android Spinner - How to make dropdown view transparent?

和这一个:

How to customize the Spinner dropdown view

我感觉我对下拉列表的唯一访问权限是使用xml参数或Spinner适配器。然而,无论如何我决定提出这个问题来放松我的上司。

在我的情况下,另一件可能有用的事情是在Spinner用完后收到通知,并根据此通知找到打开的弹出窗口实例,但是请遵循以下问题:

Spinner: get state or get notified when opens

看起来这也无法在不将Spinner扩展到自定义视图的情况下完成,这在我的情况下是不可能的,因为我需要从我这样做的SDK方面做到这一点写作用于标准Spinner

这里有没有人处理Spinner并设法获取下拉列表的视图实例,或者甚至更好地获取其中一个下拉项的视图实例?如果你能指导我如何实现这一目标,我将不胜感激?

更新:我已设法使用以下代码获取微调器下拉菜单的视图层次结构:

//Function to get all available windows of the application using reflection
private void logRootViews() {
    try {
        Class wmgClass = Class.forName("android.view.WindowManagerGlobal");
        Object wmgInstnace = wmgClass.getMethod("getInstance").invoke(null, (Object[])null);

        Method getViewRootNames = wmgClass.getMethod("getViewRootNames");
        Method getRootView = wmgClass.getMethod("getRootView", String.class);
        String[] rootViewNames = (String[])getViewRootNames.invoke(wmgInstnace, (Object[])null);

        for(String viewName : rootViewNames) {
            View rootView = (View)getRootView.invoke(wmgInstnace, viewName);
            Log.i(TAG, "Found root view: " + viewName + ": " + rootView);
            getViewHierarchy(rootView);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

//Functions to get hierarchy
private void getViewHierarchy(View view) {
    //This is how I start recursion to get view hierarchy
    if (view instanceof ViewGroup) {
        ViewGroup group = (ViewGroup) view;
        dumpViewHierarchyWithProperties(group, 0);
    } else {
        dumpViewWithProperties(view, 0);
    }
}

private void dumpViewHierarchyWithProperties(ViewGroup group, int level) {
    if (!dumpViewWithProperties(group, level)) {
        return;
    }

    final int count = group.getChildCount();
    for (int i = 0; i < count; i++) {
        final View view = group.getChildAt(i);
        if (view instanceof ViewGroup) {
            dumpViewHierarchyWithProperties((ViewGroup) view, level + 1);
        } else {
            dumpViewWithProperties(view, level + 1);
        }
    }
}

private boolean dumpViewWithProperties(View view, int level) {
    //Add to view Hierarchy.
    if (view instanceof TextView) {
        Log.d(TAG, "TextView from hierarchy dumped: " + view.toString() + " with text: " + ((TextView) view).getText().toString() + " ,in Level: " + level);
    } else {
        Log.d(TAG, "View from hierarchy dumped: " + view.toString() + " ,in Level: " + level);
    }
    return true;
}

问题在于,要获得应用程序的所有装饰窗口,我需要使用反射,这是我在SDK中可以做的事情,我写的更多,据我所知,我在这里使用私有API,可随时更改,据我所知,Google会阻止商店中使用私有API的应用程序。

所以更新的问题是:有没有办法在没有反射和私有API的情况下执行相同的操作?

0 个答案:

没有答案