Как заставить раскрывающийся список Spinner рисовать на нем или вид одного из элементов в раскрывающемся списке?

Мне нужно, чтобы команда разработчиков продукта получила экземпляр открытого в данный момент раскрывающегося списка Spinner и изменила его или представила Showcase над одним из его элементов раскрывающегося списка. После рассмотрения некоторых вопросов здесь и других статей, подобных этой:

Android Spinner — как сделать раскрывающийся список прозрачным?

и этот:

Как настроить раскрывающийся список Spinner

У меня такое ощущение, что единственный доступ, который у меня есть к раскрывающемуся списку, — это использование параметров xml или адаптера Spinner. И все же я решил задать этот вопрос, чтобы расслабить моего начальника.

Еще одна вещь, которая может быть полезна в моем случае, - это получать уведомления, когда Spinner израсходовано, и находить открытый экземпляр всплывающего окна в результате этого уведомления, но после этого вопроса:

Spinner: получить состояние или получить уведомление при открытии

Похоже, это также невозможно сделать без расширения 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?


person Emil Adz    schedule 18.05.2017    source источник