Мне нужно, чтобы команда разработчиков продукта получила экземпляр открытого в данный момент раскрывающегося списка 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?