2012-01-13 4 views
1

bonjour, j'essayais la classe SharedPreferences et j'ai créé deux classes, "TestingActivity", étendant android.app.Activity et AccountSettings avec deux fonctions statiques à définir et récupérer une clé de SharedPreferences.Android - démarrage d'une nouvelle activité (java.lang.NullPointerException)

J'ai cette erreur lors de l'exécution intention de l'activité principale:

01-12 17:18:47.890: E/AndroidRuntime(5539): FATAL EXCEPTION: main 
    01-12 17:18:47.890: E/AndroidRuntime(5539): java.lang.RuntimeException: Unable to start activity ComponentInfo{es.LandeSoft/es.LandeSoft.TestingActivity}: java.lang.NullPointerException 
    01-12 17:18:47.890: E/AndroidRuntime(5539):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651) 
    01-12 17:18:47.890: E/AndroidRuntime(5539):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 
    01-12 17:18:47.890: E/AndroidRuntime(5539):  at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
    01-12 17:18:47.890: E/AndroidRuntime(5539):  at  android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 
    01-12 17:18:47.890: E/AndroidRuntime(5539):  at android.os.Handler.dispatchMessage(Handler.java:99) 
    01-12 17:18:47.890: E/AndroidRuntime(5539):  at android.os.Looper.loop(Looper.java:130) 
    01-12 17:18:47.890: E/AndroidRuntime(5539):  at android.app.ActivityThread.main(ActivityThread.java:3691) 
    01-12 17:18:47.890: E/AndroidRuntime(5539):  at java.lang.reflect.Method.invokeNative(Native Method) 
    01-12 17:18:47.890: E/AndroidRuntime(5539):  at java.lang.reflect.Method.invoke(Method.java:507) 
    01-12 17:18:47.890: E/AndroidRuntime(5539):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907) 
    01-12 17:18:47.890: E/AndroidRuntime(5539):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 
    01-12 17:18:47.890: E/AndroidRuntime(5539):  at dalvik.system.NativeStart.main(Native Method) 
    01-12 17:18:47.890: E/AndroidRuntime(5539): Caused by: java.lang.NullPointerException 
    01-12 17:18:47.890: E/AndroidRuntime(5539):  at es.LandeSoft.TestingActivity.onCreate(TestingActivity.java:30) 
    01-12 17:18:47.890: E/AndroidRuntime(5539):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    01-12 17:18:47.890: E/AndroidRuntime(5539):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 
    01-12 17:18:47.890: E/AndroidRuntime(5539):  ... 11 more 

Im commencer l'activité du principal lanceur d'activité avec ce code:

Intent intent= new Intent(this,TestingActivity.class); 
startActivity(intent);</i> 

La classe d'activité est réel simple et c'est le suivant: paquet es.LandeSoft;

import es.LandeSoft.R; 
    import android.app.Activity; 
    import android.os.Bundle; 
    import android.view.Gravity; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.TextView; 
    import android.widget.Toast; 

    public class TestingActivity extends Activity { 

    TextView lblDatos=null; 
    EditText DatosAGuardar =null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     Button botonGuardar = (Button) findViewById(R.id.btnGuardar); 
     Button botonRecuperar = (Button) findViewById(R.id.btnRecuperar); 
     lblDatos = (TextView) findViewById(R.id.textView1); 
     DatosAGuardar= (EditText) findViewById(R.id.txtPref); 

     botonGuardar.setOnClickListener(new OnClickListener() {   
      @Override 
      public void onClick(View v) {    
       AccountSettings.SavePassword(getApplicationContext(),"PASSWORD_APP",DatosAGuardar.getText().toString()); 
       ShowToast("Se ha guardado el password: " + DatosAGuardar.getText().toString() , 2500); 
      } 
     }); 

     botonRecuperar.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       String clave= AccountSettings.GetPassword(getApplicationContext(), "PASSWORD_APP"); 
       lblDatos.setText(clave); 
       ShowToast("Clave Recuperada: " + clave,2000); 

      } 
     }); 

    } 

    private void ShowToast(String MessageT, int Duracion) 
    { 
      Toast miTostada= new Toast(getApplicationContext()); 
      miTostada.setText(MessageT); 
      miTostada.setDuration(Duracion); 
      miTostada.setGravity(Gravity.CENTER,0,0); 
      miTostada.show(); 

    } 
} 


**The AccountSettings.java is the following:** 

    package es.LandeSoft; 

    import android.content.Context; 
    import android.content.SharedPreferences; 
    import android.content.SharedPreferences.Editor; 

    public class AccountSettings { 


    public static String GetPassword (Context Contexto, String Key) 
    { 
     SharedPreferences savedSession=  Contexto.getSharedPreferences(Key,Context.MODE_PRIVATE); 
     return savedSession.getString(Key, null);  
    } 

    public static void SavePassword(Context context, String Key, String Value) 
    { 
     Editor editor = context.getSharedPreferences(Key,Context.MODE_PRIVATE).edit(); 
       editor.putString(Key, Value);   

    } 


} 

Le XML TestingActivity est le suivant:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/TextViewInfo" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/TextViewInfo_Text" /> 


    <EditText 
     android:id="@+id/txtPref" 
     android:inputType="text"   
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
     <requestFocus /> 
    </EditText> 

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

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

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     /> 

</LinearLayout> 

et le manifeste Android:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="es.LandeSoft" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="8" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"/> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.INTERNET"/> 



    <application android:label="@string/app_name" 
       android:debuggable="true" 
       android:icon="@drawable/landesofticon"> 
       <activity android:name="es.LandeSoft.LandeSoftActivity" 
        android:label="@string/app_name">     

        <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 
        <category android:name="android.intent.category.LAUNCHER" /> 
        </intent-filter> 
       </activity> 

       <activity android:name="es.LandeSoft.FacebookClass"></activity> 
       <activity android:name="es.LandeSoft.TestingActivity"></activity> 

    </application> 
</manifest> 

Je ne comprends pas pourquoi la méthode OnCreate se bloque, quelqu'un peut-il donner moi un indice? Merci d'avance!

+0

Vous devez définir la vue de contenu avant de pouvoir appeler 'findViewById (...)'. Si vous ne trouvez pas 'findViewById (...)' retournera toujours 'null' pour vos boutons et toute autre chose dans le layout XML. Encore une chose .... 'import es.LandeSoft.R' - n'importer explicitement aucun fichier' R', cela peut vraiment causer des problèmes. – Squonk

+0

Vous devez utiliser setContentView (R.layout.yourlayoutfile) immédiatement après le super.onCreate (savedInstanceState) dans votre fichier TestingActivity.java. –

+0

Vous ne devez pas utiliser de majuscules dans la nomenclature du fichier XML.Nombrez votre TestActivity.xml à test_activity.xml – himanshu

Répondre

3

Je ne vois pas votre R.layout.main pour votre mise en page ou votre TestingActivity.xml appelé. Vérifier que

+0

Merci, je l'ai accidentellement supprimé et je ne me suis pas rendu compte que ce n'était pas là –

+1

cool :) Chanceux @Vamshi qui a obtenu sa réponse acceptée même s'il y a répondu en dernier :) –

+0

Changé le vote. J'étais avec la version mobile un faux vérifié. Merci @ Rashmi.B –

2

Il n'y a pas setContentView(R.layout.yourxml); Dans votre code

+2

Oh Jésus, je devrais l'avoir supprimé sans préavis. Merci beaucoup!. 4 yeux valent mieux que deux! : D –

+0

OK, maintenant ça marche? si oui acceptez la réponse – Vamshi

1

setContentView (R.layout.main); n'est pas dispaly dans votre fichier TestingActivity.class. S'il n'est pas ajouté, ajoutez-le.

0

Oui Rashmi.B est vrai que je ne pouvais pas non plus trouver le setContentView(R.layout.TestingActivity); .Ajoutez la ligne dans votre méthode onCreate() et exécutez à nouveau le code.

0

Il vous manque setContentView (R.layout.) Dans la méthode onCreate. remplacez celui que vous avez.

:)

Questions connexes