2013-08-05 6 views
1

J'ai copié le code suivant d'un livre. Et quand je lance l'application, elle ne démarre pas.android onClickListener (newbie)

La ligne incriminée est aboutButton.setOnClickListener(this);. Si je l'assomme, l'application fonctionne.

Des indices?

Merci.

G.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    View aboutButton = findViewById(R.id.main_about_button); 
    aboutButton.setOnClickListener(this); 
    setContentView(R.layout.activity_main); 
} 


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:gravity="center" 
    tools:context=".MainMenu" 
    > 

    <TextView 
     android:id="@+id/welcome_title" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:textStyle="bold" 
     android:textSize="25sp" 
     android:text="@string/welcome_title" 
     /> 

    <Button 
     android:id="@+id/search_button" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/search_button" 
     /> 

    <Button 
     android:id="@+id/new_button" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/new_button" 
     /> 

    <Button 
     android:id="@+id/help_button" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/help_button" 
     /> 

    <Button 
     android:id="@+id/exit_button" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/exit_button" 
     /> 

    <Button 
     android:id="@+id/main_about_button" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/exit_button" 
     android:layout_alignLeft="@+id/exit_button" 
     android:text="@string/main_about_button" 
     android:clickable="true" 
     /> 

</LinearLayout> 

Répondre

2

aboutButton est null. Vous ne pouvez pas l'initialiser tant que vous n'avez pas gonflé le layout. Changer à

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); // Switch these two lines 
    View aboutButton = findViewById(R.id.main_about_button); 
    aboutButton.setOnClickListener(this); 

} 

Votre Views existe au sein de votre layout ce qui signifie qu'ils retourneront null si vous essayez de les initialiser avant de gonfler votre layout, en utilisant un layout inflater ou en appelant setContentView(), qui vous donnera un NPE en essayant de appelez une fonction sur eux ou de définir un listener

0

Je vous recommande de déclarer le aboutButton comme un bouton. Essayez ceci:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Button aboutButton = (Button) findViewById(R.id.main_about_button); 
    aboutButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      // Do something 
     } 
    }); 

} 

J'espère que ça aide!

+0

J'ai essayé de changer la déclaration avec Button. ça n'a pas arrangé ça. Merci. –

1

a dû mettre les instructions d'écouteur APRÈS la commande SeContentView. qui l'a réparé. Je suppose que setContentView importe toutes les variables & ids de la mise en page. et le findViewById juste retourné un pointeur nul ou quelque chose.

si quelqu'un peut confirmer ma conjecture, je l'apprécierais.

+0

Avez-vous même regardé ma réponse? Il a confirmé votre estimation une heure avant que vous posté ceci. – codeMagic

+0

désolé. J'ai seulement eu votre réponse après ma conjecture. –

+0

C'est très bien. Je suis content que tu l'aies compris. Vous pouvez toujours l'accepter ou le vôtre afin qu'il puisse aider les autres à l'avenir – codeMagic

Questions connexes