2015-01-23 5 views
0

Почему firstId не равен secondId? firstId является неправильным, secondId является правильным.Получить идентификатор ресурса по названию возвращает «wrong» id

Как я могу «направить» getIdentifier на поиск нужного search_button?

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    MenuItem searchItem = menu.findItem(R.id.action_search); 
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 

    int firstId = getResources().getIdentifier("android:id/search_button", null, null); 
    int secondId = recursiveLoopChildren(searchView, "search_button").getId();  

    return true; 
} 

public View recursiveLoopChildren(ViewGroup p_parent, String p_resourceName) { 
    View view = null; 

    for (int i = p_parent.getChildCount() - 1; i >= 0; i--) { 
     final View child = p_parent.getChildAt(i); 
     if (child instanceof ViewGroup) { 
      View returnedChild = recursiveLoopChildren((ViewGroup) child, p_resourceName); 
      if(returnedChild != null) { 
       view = returnedChild; 
       break; 
      } 
     } else { 
      String entryName = getResources().getResourceEntryName(child.getId()); 
      if (child != null && entryName.equals(p_resourceName)) { 
       view = child; 
       break; 
      } 
     } 
    } 

    return view; 
} 
+2

Это похоже на то, для чего вы должны использовать отладчик. – laalto

+1

Ваше основное мышление ошибочно, что может привести вас в неправильном направлении. 'Как я могу заставить« getIdentifier »искать правильную функцию search_button' getIndentifier(). Вы можете быть уверены в этом, потому что миллионы приложений используют его миллионы раз в день без проблем. Если это не сработает, это будет серьезной ошибкой и будет исправлено быстро, поскольку это существенно остановит большинство приложений, работающих вообще. Поэтому ваше мышление должно быть «что я сделал неправильно». Если вы посмотрите на исходный код для getIdentifier(), вы также увидите, насколько это просто и немыслимо, что он потерпит неудачу. – Simon

+0

Я бы начал с нормализации этого цикла. 'for (int i = 0; i Simon

ответ

1

вызова getIdentifier(), как это:

int firstId = getResources().getIdentifier("search_button", "id", getPackageName()); 

Тогда это должен вернуть правильный идентификатор.

0

попробовать это

final View child = p_parent.getChildAt(i - 1); 

если не работает .. попробуйте с этим условием ..

for (int i = p_parent.getChildCount(); i > 0; i--) 
+0

Этот метод работает и выводит правильный вид (id). Ядро Android не делает этого. – svenkapudija

Смежные вопросы