Esta é uma pergunta canônica para um problema frequentemente postado no StackOverflow.
Estou seguindo um tutorial. Criei uma nova atividade usando um assistente. Eu recebo NullPointerException
ao tentar chamar um método em View
s obtidos com findViewById()
em minha atividade onCreate()
.
Atividade onCreate()
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View something = findViewById(R.id.something);
something.setOnClickListener(new View.OnClickListener() { ... }); // NPE HERE
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
Layout XML ( fragment_main.xml
):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="packagename.MainActivity$PlaceholderFragment" >
<View
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/something" />
</RelativeLayout>
findViewById()
sobrerootView
e não sobre a atividade.Experimente o
OnStart()
método e apenas useou Declare qualquer View usando o
getView().findViewById
método emonStart()
Declarar ouvinte de clique em exibição por
anyView.setOnClickListener(this);
fonte
Tente mudar suas visualizações de acesso para o método onViewCreated de fragmento porque às vezes, quando você tenta acessar as visualizações no método onCreate, elas não são renderizadas no momento, resultando em exceção de ponteiro nulo.
fonte
Concordo, esse é um erro típico porque as pessoas geralmente não entendem como os Fragments funcionam quando começam a trabalhar no desenvolvimento do Android. Para aliviar a confusão, criei um código de exemplo simples que publiquei originalmente em Application is Stop in android emulator , mas também o postei aqui.
Um exemplo é o seguinte:
activity_container.xml:
ExampleFragment:
fragment_example.xml:
E esse deve ser um exemplo válido, ele mostra como você pode usar uma Activity para exibir um Fragment e manipular eventos nesse Fragment. E também como se comunicar com a atividade contida.
fonte
Otto
para comunicação em vez de callbacks, e useButterknife
para injetar visualizações.A visão "algo" está em fragmento e não em atividade, portanto, em vez de acessá-la em atividade, você deve acessá-la na classe de fragmento como
Em PlaceholderFragment.class
fonte
Você está tentando acessar os elementos da interface do usuário no
onCreate()
, mas é muito cedo para acessá-los, uma vez que as visualizações de fragmento podem ser criadas noonCreateView()
método. E oonActivityCreated()
método é confiável para lidar com qualquer ação neles, uma vez que a atividade está totalmente carregada neste estado.fonte
Adicione o seguinte em seu activity_main.xml
fonte
Já que você declarou sua View no
fragment_main.xml
, mova aquele trecho de código de onde você obteve o NPE noonCreateView()
método do fragmento. Isso deve resolver o problema.fonte
no código postado acima na questão, há um problema: você está usando R.layout.activity_main no método oncreate, mas o nome dos arquivos xml é "fragment_main.xml", significa que você está tentando obter a visualização do arquivo fragment_main.xml que não está sendo mostrado, portanto, fornece exceção de ponteiro nulo. mude o código como:
fonte
Você tem que lembrar que o que é importante é: NullPointerException ocorre quando você declara sua variável e tenta recuperar seu valor antes de atribuir valor a ela.
fonte
Use o método onViewCreated () sempre que usar ou chamar visualizações de fragmentos.
fonte
Eu tenho o mesmo
NullPointerException
inicializando um ouvinte depois de chamarfindViewById()
onCreate()
eonCreateView()
métodos.Mas quando uso o,
onActivityCreated(Bundle savedInstanceState) {...}
ele funciona. Então, eu poderia acessar oGroupView
e definir meu ouvinte.Espero que seja útil.
fonte
Biblioteca mais popular para encontrar visualizações que é usada por quase todos os desenvolvedores.
Faca de manteiga
Como posso, há respostas suficientes explicando como encontrar pontos de vista com a metodologia adequada. Mas se você é um desenvolvedor Android e codifica frequentemente diariamente, então você pode usar uma faca de manteiga, o que economiza muito tempo em encontrar visualizações e você não precisa escrever código para isso. Em 2-3 etapas, você pode encontrar visualizações em milissegundos .
Adicionar dependência no gradle de nível de aplicativo:
Adicionar plugin para faca de manteiga:
Em seguida, procure por Android ButterKnife Zelezny e instale o plugin e reinicie o seu estúdio e pronto.
Agora basta ir ao método Oncreate de sua atividade e clicar com o botão direito em seu layout_name e tocar no botão gerar e selecionar a opção de injeção de butterknife e suas referências de visualizações serão criadas automaticamente como a menção abaixo:
fonte