2016-09-22 8 views
1

Ich mache eine App, die 2 Java-Klassen hat: MainActivity und SecondActivity. MainActivity initiiert die SecondActivity mithilfe einer onClick Methode.Null Zeiger Ausnahme Android Array

Die SecondActivity enthält 2 Arrays in der Datei strings.xml. Die Klasse SecondActivity möchte alle Array-Variablen von strings.xml in sich selbst speichern, um sie für einige Methoden zu verwenden. Ich denke, ich mache es in die falsche Richtung, als ich versuchte, die Arrays direkt in der SecondActivity zu speichern und es funktionierte, aber wenn ich die Arrays in strings.xml speichern, gibt es eine NullPointerException. Hier

ist der SecondActivity Code:

package com.android.ict.seneca.androidpocketguide; 

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.AutoCompleteTextView; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

public class SecondActivity extends Activity { 

    private final String CLASS_NAME = "SecondActivity"; 

    String [] Vocabularies = getResources().getStringArray(R.array.Vocabularies_array); 
    String [] meanings = getResources().getStringArray(R.array.meanings_array); 

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

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(
       this, 
       android.R.layout.simple_dropdown_item_1line, Vocabularies); 

     //ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line, meanings); 

     AutoCompleteTextView textView = 
       (AutoCompleteTextView) findViewById(R.id.vocabularies); 

     textView.setThreshold(2); // minimum number of characters to be typed 

     textView.setAdapter(adapter); // connect the list of suggestions to the View object 

    } 

    public void onStart(){ 
     super.onStart(); 
     Log.d(CLASS_NAME, "onStart invoked!"); 
    } 

    public void onPause(){ 
     super.onPause(); 
     Log.d(CLASS_NAME, "onPause invoked!!"); 
    } 

    public void onResume(){ 
     super.onResume(); 
     Log.d(CLASS_NAME, "onResume invoked!!"); 
    } 

    public void onStop(){ 
     super.onStop(); 
     Log.d(CLASS_NAME, "onStop invoked!!!"); 
    } 

    public void onDestroy(){ 
     super.onDestroy(); 
     Log.d(CLASS_NAME, "onDestroy INVOKED!!!"); 
    } 

    public void onRestart(){ 
     super.onRestart(); 
     Log.d(CLASS_NAME, "onRestart invoked!!"); 
    } 

    // event handler for the button 
    public void onClick(View view) { 


     Intent data = new Intent(); 

     EditText usr = 
       (EditText) findViewById(R.id.vocabularies); // get user input 

     // set the data part (an URI reference) of an intent 
     data.setData(Uri.parse(usr.getText().toString())); 
     String s = data.getData().toString(); 

     int flag = 0; 

     for(int i=0; i<Vocabularies.length;i++) 
     { 
      if(s.equals(Vocabularies[i])) 
      { 
       flag = i; 
      } 
     } 

     Toast.makeText(this, "YOU'VE ENTERED: " + s, Toast.LENGTH_LONG).show(); 

     String m = meanings[flag]; 
     String disp = "Vocabulary: " + s + "\n" + "Meaning: " + m; 

     TextView textViewObj1 = (TextView) findViewById(R.id.meaning); 
     textViewObj1.setText(disp); 

     //finish(); //--- close the activity AND RETURN CONTROL TO THE REQUESTING ACTIVITY 


     //EditText txt_username = (EditText) findViewById(R.id.txt_username); 
    } // end onClick 
} 

Hier ist der MainActivity Code:

package com.android.ict.seneca.androidpocketguide; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 
    private final String CLASS_NAME = "FirstActiviy"; 
    private int request_Code = 1; 


    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Log.d(CLASS_NAME, "onCreate invoked!"); 
    } 

    public void onStart(){ 
     super.onStart(); 
     Log.d(CLASS_NAME, "onStart invoked!"); 
    } 

    public void onPause(){ 
     super.onPause(); 
     Log.d(CLASS_NAME, "onPause invoked!!"); 
    } 

    public void onResume(){ 
     super.onResume(); 
     Log.d(CLASS_NAME, "onResume invoked!!"); 
    } 

    public void onStop(){ 
     super.onStop(); 
     Log.d(CLASS_NAME, "onStop invoked!!!"); 
    } 

    public void onDestroy(){ 
     super.onDestroy(); 
     Log.d(CLASS_NAME, "onDestroy INVOKED!!!"); 
    } 

    public void onRestart(){ 
     super.onRestart(); 
     Log.d(CLASS_NAME, "onRestart invoked!!"); 
    } 


    // event handler for the button (activity 2) 
    public void onClick(View view) { 

     startActivityForResult(new Intent(
         "com.android.ict.seneca.androidpocketguide.second"), // declared by an intent filter 
       request_Code); // (requesting) activity ID 

     Log.d(CLASS_NAME, "after startActivityForResult"); 
//intent.setData(Uri.parse("com.seneca.lab2b.abbas")); 
     //startActivity(intent); 
    } 

    /* 
    public void onActivityResult(int requestCode, // used to match the REQUESTING activity ID 
            int resultCode, // result code set by the sender (i.e. the TARGET activity) 
            Intent data)  // an intent passed by the sender (i.e. the TARGET activity) 
    { 
     if (requestCode == request_Code) { 
      if (resultCode == RESULT_OK) { 


       //TextToSpeech(data.getData().toString()); 

       Intent intent = getIntent(); 

       String s = data.getData().toString(); 

       TextView textViewObj1 = (TextView) findViewById(R.id.line); 
       textViewObj1.setText(s); 


       Toast.makeText(
         this, 
         "MESSAGE RECEIVED: " + s, // retrieve data from the intent 
         // API Question: What is the return type of getData()? 
         Toast.LENGTH_LONG).show(); 
      } 
     } 
     Log.d(CLASS_NAME, "onActivityResult: what is next?"); 
    } 


    // event handler for a button (activity 3) 
    public void onClick3(View view) { 

     Intent dataIntent = new Intent(this, ThirdActivity.class);//"com.seneca.lab2b.third"); // explicit intent 

     // the putExtra() method 
     dataIntent.putExtra("greeting", "Good morning Android!"); 
     dataIntent.putExtra("number", 123); 

     // create a Bundle object 
     Bundle bundle = new Bundle(); 
     bundle.putString("My name", "Abbas Zoeb"); 
     bundle.putInt("Student ID", 56789 ); 

     // putExtras(): store the bundle in the intent 
     dataIntent.putExtras(bundle); 

     // launch the third activity 
     startActivity(dataIntent); 

     //startActivity(new Intent(this, ThirdActivity.class)); 

    } 
    */ 

} 

Hier ist das Fehlerprotokoll:

09-21 23: 43: 19,907 26183-26183/com.android.ict.seneca.androidpocketguide E/AndroidRuntime: FATALE AUSNAHME: Haupt Prozess: com.android.ict.seneca.androidpocketguide, PID: 26183 java.lang.RuntimeException: Kann nicht instanziiert Aktivität ComponentInfo {com.android.ict.seneca.androidpocketguide/com.android.ict.seneca.androidpocketguide.SecondActivity} : java.lang.NullPointerException: Versuch, die virtuelle Methode 'android.content.res.Resources android.content.Context.getResources()' für eine Nullobjekt-Referenz bei android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2327) bei android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2476) bei android.app.ActivityThread.-wrap11 (ActivityThread.java) bei android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1344) bei android.os.Handler.dispatchMessage (Handler.java:102) bei android.os.Looper.loop (Looper.java:148) bei android.app.ActivityThread.main (ActivityThread.java:5417) bei java.lang.reflect.Method.invoke (Native Methode) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:726) bei com.android.internal.os.ZygoteInit.main (ZygoteInit .java: 616) verursacht durch: java.lang.NullPointerException: Versuch, die virtuelle Methode 'android.content.res.Resources android.content.Context.getResources()' für eine Nullobjekt-Referenz bei android.content.ContextWrap aufzurufen per.getResources (ContextWrapper.java:87) bei android.view.ContextThemeWrapper.getResources (ContextThemeWrapper.java:81) bei com.android.ict.seneca.androidpocketguide.SecondActivity. (SecondActivity.java:22) bei java .lang.Class.newInstance (Native Methode) bei android.app.Instrumentation.newActivity (Instrumentation.java:1067) bei android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2317) bei android.app.ActivityThread. handleLaunchActivity (ActivityThread.java:2476) bei android.app.ActivityThread.-wrap11 (ActivityThread.java) bei und roid.app.ActivityThread $ H.handleMessage (AktivitätsThread.java: 1344) bei android.os.Handler.dispatchMessage (Handler.java:102) bei android.os.Looper.loop (Looper.java:148) bei android.app.ActivityThread.main (ActivityThread.java: 5417) bei java.lang.reflect.Method.invoke (Mutter Methode) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:726) bei com.android.internal.os.ZygoteInit .main (ZygoteInit.java:616)

Hier ist die string.xml Datei:

<resources> 
    <string name="app_name">Android Pocket Guide</string> 
    <string-array name="Vocabularies_array"> 
     <item>activity</item> 
     <item>AVD</item> 
     <item>ART</item> 
     <item>Dalvik</item> 
     <item>intent</item> 
     <item>intent filter</item> 
     <item>explicit intent</item> 
     <item>implicit intent</item> 
     <item>LogCat</item> 
     <item>bundle</item> 
     <item>Gradle</item> 
     <item>Android Device Monitor</item> 
     <item>SDK manager</item> 
     <item>minSdkVersion</item> 
    </string-array> 

    <string-array name="meanings_array"> 
     <item>An activity represents a single screen with a user interface just like window or frame of Java</item> 
     <item>An Android Virtual Device (AVD) is an emulator configuration that lets you model an actual device by defining hardware and software options to be emulated by the Android Emulator.</item> 
     <item>Android Runtime (ART) is an application runtime environment used by the Android operating system.</item> 
     <item>Dalvik is a part of the software stack that makes up the Android platform.</item> 
     <item>Intent can be defined as a simple message objects which is used to communicate from 1 activity to another.</item> 
     <item>Specifies the types of intents that an activity, service, or broadcast receiver can respond to</item> 
     <item>An explicit intent is one that you use to launch a specific app component, such as a particular activity or service in your app</item> 
     <item>Implicit intents do not name a specific component, but instead declare a general action to perform, which allows a component from another app to handle it.</item> 
     <item>Logcat is a command-line tool that dumps a log of system messages, including stack traces when the device throws an error and messages that you have written from your app with the Log class.</item> 
     <item>A Bundle is a set of key/value pairs, where it implements an interface called Parcelable.</item> 
     <item>Gradle is a custom build tool used to build android packages (apk files) by managing dependencies and providing custom build logic.</item> 
     <item>Android Device Monitor is a standalone tool that provides a UI for several Android application debugging and analysis tools.</item> 
     <item>A software development kit that enables developers to create applications for the Android platform.</item> 
     <item>An integer designating the minimum API Level required for the application to run.</item> 
    </string-array> 


</resources> 
+0

Es ist nicht in der Lage, den Kontext zu finden, für den Sie getResources() verwendet haben. Zeichenfolge [] Vocabularies = getResources(). GetStringArray (R.array.Vocabularies_array); Zeichenfolge [] Bedeutungen = getResources(). GetStringArray (R.array.meanings_array); Intialisieren Sie diesen Teil unter oncreate, deklarieren Sie ihn einfach global. AS Kontext ist nicht initialisiert –

+0

Diese Antworten haben sicherlich geholfen, mein Fehler wurde behoben. Vielen Dank Jungs/Mädels :) –

Antwort

0

auf diese Weise versuchen

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_second); 
     Vocabularies = getResources().getStringArray(R.array.Vocabularies_array); 
     meanings = getResources().getStringArray(R.array.meanings_array); 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(
       this, 
       android.R.layout.simple_dropdown_item_1line, Vocabularies); 

     //ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line, meanings); 

     AutoCompleteTextView textView = 
       (AutoCompleteTextView) findViewById(R.id.vocabularies); 

     textView.setThreshold(2); // minimum number of characters to be typed 

     textView.setAdapter(adapter); // connect the list of suggestions to the View object 

    } 
+0

Diese Antworten haben sicherlich geholfen, mein Fehler wurde behoben. Vielen Dank Jungs/Mädchen :) –

0

Ihre Arrays im globalen Kontext versuchen zu erklären, dann sie einen gewissen Wert während einer der Tätigkeit des Lebenszyklusphasen zuordnen (d onCreate(), onResume() usw.).

Das Problem, das Sie haben, ist mit getResources(). Ich würde eine globale Variable vom Typ Context erstellen. Dann, was ich würde in onCreate() tun, ist dies:

context = this; 
vocabularies = context.getResources().getStringArray(R.array.Vocabularies_array); 
meanings = context.getResources().getStringArray(R.array.meanings_array); 

Hoffnung, das hilft!

+0

Diese Antworten haben sicherlich geholfen, mein Fehler wurde behoben. Vielen Dank Jungs/Mädels :) –

0

Diese variablen Initialisierungen ...

String [] Vocabularies = getResources().getStringArray(R.array.Vocabularies_array); 
String [] meanings = getResources().getStringArray(R.array.meanings_array); 

... müssen wahrscheinlich in einem Konstruktor gehen, oder noch wahrscheinlicher in onCreate(...), speziell nach

super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_second); 
0

Initialisierung der Variablen in einigen Methode wie oncreate/onPostcreated zB

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Vocabularies = getResources().getStringArray(R.array.Vocabularies_array); 
    meanings = getResources().getStringArray(R.array.meanings_array); 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(
      this, 
      android.R.layout.simple_dropdown_item_1line, Vocabularies); 

    //ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line, meanings); 

    AutoCompleteTextView textView = 
      (AutoCompleteTextView) findViewById(R.id.vocabularies); 

    textView.setThreshold(2); // minimum number of characters to be typed 

    textView.setAdapter(adapter); // connect the list of suggestions to the View object 

}