Développeur d'application Android, sélecteur de numéros personnalisé pour l'API niveau 8
-
26-12-2019 - |
Question
J'essaie de créer un sélecteur de numéros personnalisé pour les applications qui nécessitent au minimum le niveau d'API 8. Jusqu'à présent, j'ai obtenu ce code, c'est simple mais je ne sais pas comment corriger cette erreur que j'obtiens.
Le code jusqu'à présent est le suivant :
package com.example.symbol_temp ;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Integer counter=0;
Button add,sub;
final TextView display;
add = (Button) findViewById(R.id.plus);
sub = (Button) findViewById(R.id.minus);
display = (TextView) findViewById(R.id.showtemperature);
add.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
counter++;
display.setText( "" + counter);
}
});
sub.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
counter--;
display.setText( "" + counter);
}
});
}
}
et le XML est le suivant :
<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="com.example.symbol_temp.MainActivity$PlaceholderFragment" >
<TextView
android:id="@+id/showtemperature"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/minus"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/showtemperature"
android:layout_centerHorizontal="true"
android:text="+"
android:onClick="add"/>
<Button
android:id="@+id/plus"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/minus"
android:layout_below="@+id/showtemperature"
android:text="-" />
</RelativeLayout>
Obtenir ceci dans LogCat :
04-14 13:31:59.222: E/AndroidRuntime(359): FATAL EXCEPTION: main
04-14 13:31:59.222: E/AndroidRuntime(359): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.symbol_temp/com.example.symbol_temp.MainActivity}: java.lang.NullPointerException
04-14 13:31:59.222: E/AndroidRuntime(359): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
04-14 13:31:59.222: E/AndroidRuntime(359): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
04-14 13:31:59.222: E/AndroidRuntime(359): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
04-14 13:31:59.222: E/AndroidRuntime(359): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
04-14 13:31:59.222: E/AndroidRuntime(359): at android.os.Handler.dispatchMessage(Handler.java:99)
04-14 13:31:59.222: E/AndroidRuntime(359): at android.os.Looper.loop(Looper.java:123)
04-14 13:31:59.222: E/AndroidRuntime(359): at android.app.ActivityThread.main(ActivityThread.java:4627)
04-14 13:31:59.222: E/AndroidRuntime(359): at java.lang.reflect.Method.invokeNative(Native Method)
04-14 13:31:59.222: E/AndroidRuntime(359): at java.lang.reflect.Method.invoke(Method.java:521)
04-14 13:31:59.222: E/AndroidRuntime(359): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-14 13:31:59.222: E/AndroidRuntime(359): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-14 13:31:59.222: E/AndroidRuntime(359): at dalvik.system.NativeStart.main(Native Method)
04-14 13:31:59.222: E/AndroidRuntime(359): Caused by: java.lang.NullPointerException
04-14 13:31:59.222: E/AndroidRuntime(359): at com.example.symbol_temp.MainActivity.onCreate(MainActivity.java:24)
04-14 13:31:59.222: E/AndroidRuntime(359): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-14 13:31:59.222: E/AndroidRuntime(359): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
04-14 13:31:59.222: E/AndroidRuntime(359): ... 11 more
Je pense avoir changé quelques choses, la ligne numéro 24 est la suivante :
add.setOnClickListener(new View.OnClickListener() {
Merci pour votre aide.
La solution
D'après votre commentaire et
tools:context="com.example.symbol_temp.MainActivity$PlaceholderFragment"
Je suppose que les vues appartiennent à fragment_main.xml
.
Vous gonflez la mauvaise mise en page.Et vous recherchez la vue dans une mauvaise mise en page.
Change ça
setContentView(R.layout.activity_main);
à
setContentView(R.layout.fragment_main);
Change aussi ceci
Integer counter=0;
à
int counter; // primitive data type
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
counter =0;
Autres conseils
Votre variable de comptoir est déclarée à l'intérieur de la méthode, que lorsque vous essayez, déplacez vos variables au-dessus de la méthode Oncreate.
NOTE:
Cette réponse est publiée comme réponse au commentaire posté par la personne qui a posé cette question.J'ai posté ceci comme réponse par souci de concision
Utilisez cette méthode
protected void onSaveInstanceState(Bundle savedInstance) {
super.onSaveInstanceState(savedInstance);
savedInstance.putInt("myCounter",counter); }
Puis dans
onCreate(Bundle savedInstanceState){
if(savedInstanceState != null)
counter = savedInstanceState.getInt("myCounter")}
À partir de l'Instance sauvegardée qui est l'objet de la classe Bundle, vous pouvez récupérer votre valeur enregistrée et l'attribuer lors de la création.N'oubliez pas de vérifier si la valeur est nulle, car si vous exécutez votre application pour la première fois, votre compteur risque de ne pas encore être instancié et il générera une exception.
De plus, lorsque vous récupérez les valeurs enregistrées, assurez-vous de ne pas les écraser.