Eu tenho um res/layout/main.xml
incluindo estes elementos e outros:
<some.package.MyCustomView android:id="@+id/foo" (some other params) />
<TextView android:id="@+id/boring" (some other params) />
No onCreate da minha atividade, eu faço o seguinte:
setContentView(R.layout.main);
TextView boring = (TextView) findViewById(R.id.boring);
// ...find other elements...
MyCustomView foo = (MyCustomView) findViewById(R.id.foo);
if (foo == null) { Log.d(TAG, "epic fail"); }
Os outros elementos são encontrados com sucesso, mas foo
retorna nulo. MyCustomView tem um construtor MyCustomView(Context c, AttributeSet a)
e um Log.d(...)
no final desse construtor aparece com sucesso no logcat pouco antes da "falha épica".
Por que é foo
nulo?
(MyCustomView) foo = findViewById(R.id.foo);
serMyCustomView foo = (MyCustomView) findViewById(R.id.foo);
?Eu tenho o mesmo problema porque em minha visualização customizada eu substituí construtor, mas invoquei o parâmetro super contructor withot attrs. Isso é copiar e colar)
Minha versão anterior do construtor:
Agora eu tenho:
E isso funciona!
fonte
Eu tive o mesmo problema. Meu erro foi este: eu escrevi
e como usei um inflador para "carregar" a visualização de um arquivo XML, a última linha estava errada. Para resolvê-lo, tive que escrever:
Escrevi minha solução, caso alguém tenha o mesmo problema.
fonte
Parece que há vários motivos. Acabei de usar "Clean ..." no Eclipse para resolver um problema semelhante. (FindViewByID havia funcionado antes e por algum motivo começou a retornar nulo.)
fonte
Mesmo problema, mas solução diferente: eu não liguei
ANTES de tentar encontrar a vista conforme declarada aqui
fonte
Se você tiver várias versões de layout (dependendo das densidades de tela, versões do SDK), certifique-se de que todas elas incluam o elemento que você está procurando.
fonte
No meu caso, findViewById estava retornando nulo porque minha visualização personalizada se parecia com isto no XML principal:
e descobri que quando adicionei as coisas do xmlns funcionou assim:
fonte
Certifique-se de que a
setContentView(R.layout.main)
instrução chame antes dafindViewById(...)
instrução;fonte
Para mim, o problema foi resolvido quando adicionei a pasta res ao Source in Java Build Path nas configurações do projeto.
fonte
Eu tive o mesmo problema há algum tempo, quando adicionei uma Visualização personalizada por meio do XML de layout e tentei anexar um retorno de chamada em outro lugar no aplicativo ...
Eu criei uma visualização personalizada e a adicionei ao meu "layout_main.xml"
E na Activity principal, eu queria anexar alguns retornos de chamada e obter referências aos elementos da IU do XML.
O initilizer não estava fazendo nada extravagante, mas as alterações que tentava fazer na visualização personalizada (MUIComponent) ou em outros elementos de interface do usuário não personalizados simplesmente não apareciam no aplicativo.
A diferença entre "badInst" e "goodInst" é:
fonte
Isso aconteceu comigo com um componente personalizado para o Wear, mas é um conselho genérico. Se você estiver usando um Stub (como o que eu estava usando
WatchViewStub
), não poderá simplesmente fazer a chamada parafindViewById()
qualquer lugar. Tudo dentro do stub deve ser inflado primeiro, o que não acontece depoissetContentView()
. Portanto, você deve escrever algo assim para esperar que isso aconteça:fonte
Meu problema foi um erro de digitação. Eu tinha escrito
android.id
(ponto) em vez deandroid:id
. : PAparentemente, não há verificação de sintaxe em meu xml de componente personalizado. :(
fonte
Tive o mesmo problema.
Tive layout com poucos filhos. Do construtor de um deles, eu estava tentando obter referência (usando context.findViewById) para outra criança. Não estava funcionando porque o segundo filho foi definido posteriormente no layout.
Eu resolvi assim:
Funcionaria bem se a ordem dos filhos fosse oposta, mas acho que geralmente deve ser feito como acima.
fonte
findViewById
no construtor de aView
, mas sim colocar o código de inicialização emOnFinishInflate
?O
findViewById()
método às vezes retornanull
quando a raiz do layout não temandroid:id
atributo. O assistente do Eclipse para gerar arquivo xml de layout não geraandroid:id
atributos automaticamente para o elemento raiz.fonte
No meu caso, a visão estava no pai, NÃO na visão que eu estava tentando chamar. Então, na visão filho, eu tive que chamar:
fonte
A opção 'limpar' funcionou para mim.
No meu caso, a causa raiz é que o código-fonte reside em um compartilhamento de rede e minha estação de trabalho e servidor de arquivos não foram sincronizados corretamente e sofreram uma variação de 5 segundos. Os registros de data e hora nos arquivos criados pelo Eclipse estão no passado (porque são atribuídos pelo servidor de arquivos) em relação ao relógio da estação de trabalho, fazendo com que o Eclipse resolva as dependências entre os arquivos gerados e de origem incorretamente. Nesse caso, uma 'limpeza' parece funcionar, porque força uma reconstrução completa em vez de uma construção incremental que depende de carimbos de data / hora errados.
Depois de corrigir as configurações de NTP em minha estação de trabalho, o problema nunca mais ocorreu. Sem as configurações de NTP adequadas, isso aconteceria a cada poucas horas, já que os relógios mudam rapidamente.
fonte
Para adicionar outro erro trivial às respostas a serem observadas:
Verifique se você está realmente editando o arquivo XML de layout correto ...
fonte
Eu tive o mesmo problema porque esqueci de atualizar o id de visualização em todas as minhas pastas de layout.
fonte