2014-12-31 3 views
2

Я использую AppCompat и пытаюсь вызвать ImageView для кнопки вверх/назад, принадлежащей панели инструментов.Почему findViewById (R.android.id.home) всегда возвращает null?

Я знаю R.android.id.home существует, потому что я могу управлять его щелчком как пункт меню:

public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getItemId() == android.R.id.home) { 
     //this works 
    } 
    return super.onOptionsItemSelected(item); 
} 

Кроме того, всякий раз, когда я пытаюсь вызвать findViewById(android.R.id.home) - будьте onCreate, будь то onClick из пользовательской кнопки - Я получаю null. Я даже получаю null, если в примере выше я звоню findViewById(item.getItemId()).

Почему? Этот вопрос задан здесь, в большинстве случаев относительно ActionBarSherlock (который я не использую). Another time было предложено использовать:

getWindow().getDecorView().findViewById(android.R.id.home) 

Но это не работает. В этом вопросе OP также говорит, что findViewById(android.R.id.home) работает с API> 3.0, но это не так для меня. Есть идеи?

+1

«Я знаю, что R.android.id.home существует, потому что я могу управлять своим кликом как элемент меню» - это идентификатор меню. Это не обязательно идентификатор виджета. – CommonsWare

+0

@ Содружества, так что нет способа найти соответствующий вид? Я надеялся, что это связано с вопросом. – natario

+1

Я понятия не имею. Любое решение, которое вы найдете, будет по своей сути ненадежным, так как * это не ваш виджет *. Это виджет реализации панели действий. Панель действий может называть ее всем, что она хочет, использовать любой класс «View», который он хочет (или даже напрямую отображать на «Canvas») и т. Д. Не допускайте или не пытайтесь контролировать внутреннюю реализацию чужой пользовательского интерфейса. – CommonsWare

ответ

3

Независимо от того, является ли значок «дома» виджетами, и каков его класс, и каков его идентификатор (если он есть), зависит от реализации панели действий. Собственная панель действий может делать это по-разному для разных уровней API, и все это может быть иным, чем способ appcompat-v7. Не говоря уже о ActionBarSherlock или других реализациях панели действий.

В частности, android.R.id.home - это идентификатор меню, поэтому вы можете использовать его в таких местах, как onOptionsItemSelected(). Это не обязательно идентификатор виджета, поэтому он может работать или не работать с findViewById().

В идеале вы не пытаетесь объединиться с внутренней реализацией пользовательского интерфейса, который вы сами не создали.

действительно ли нужно сделать свою собственную кнопку «Вверх», чтобы ее стиль?

Я не знаю, поскольку я никогда не пытался его стилизовать.

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