2016-09-22 3 views
1

Я делаю приложение, которое имеет 2 класса java: MainActivity и SecondActivity. MainActivity инициирует SecondActivity с использованием метода onClick.Исключительный массив андроида исключений

SecondActivity имеет 2 массива, хранящихся в файле strings.xml. Класс SecondActivity хочет хранить все переменные массива из strings.xml для себя, чтобы использовать его для некоторых методов. Я думаю, что делаю это неправильно, поскольку я пытался хранить массивы непосредственно в SecondActivity, и это сработало, но когда я храню массивы в strings.xml, он дает NullPointerException.

Вот SecondActivity код:

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 
} 

Вот MainActivity код:

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)); 

    } 
    */ 

} 

Вот журнал ошибок:

09-21 23: 43: 19,907 26183-26183/com.android.ict.seneca.androidpocketguide E/AndroidRuntime: FATAL EXCEPTION: main Процесс: com.android.ict.seneca.androidpocketguide, PID: 26183 java.lang.RuntimeException: Невозможно создать экземпляр активности ComponentInfo {com.android.ict.seneca.androidpocketguide/com.android.ict.seneca.androidpocketguide.SecondActivity} : java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.content.res.Resources android.content.Context.getResources()' на ссылке нулевого объекта на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2327) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2476) на android.app.ActivityThread.-wrap11 (ActivityThread.java) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1344) на android.os.Handler.dispatchMessage (Handler.java:102) на android.os.Looper.loop (Looper.java:148) на android.app.ActivityThread.main (ActivityThread.java:5417) at java.lang.reflect.Method.invoke (собственный метод) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main (ZygoteInit .java: 616) Вызвано: java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.content.res.Resources android.content.Context.getResources()' на ссылке нулевого объекта на android.content.ContextWrap per.getResources (ContextWrapper.java:87) на android.view.ContextThemeWrapper.getResources (ContextThemeWrapper.java:81) на com.android.ict.seneca.androidpocketguide.SecondActivity. (SecondActivity.java:22) на java .lang.Class.newInstance (собственный метод) at android.app.Instrumentation.newActivity (Instrumentation.java:1067) at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2317) на android.app.ActivityThread. handleLaunchActivity (ActivityThread.java:2476) at android.app.ActivityThread.-wrap11 (ActivityThread.java) at и roid.app.ActivityThread $ H.handleMessage (ActivityThread.java: 1344) на android.os.Handler.dispatchMessage (Handler.java:102) на android.os.Looper.loop (Looper.java:148) на android.app.ActivityThread.main (ActivityThread.java: 5417) at java.lang.reflect.Method.invoke (собственный метод) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:726) at com.android.internal.os.ZygoteInit .main (ZygoteInit.java:616)

Вот файл string.xml:

<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

Он не может найти контекст, для которого вы использовали getResources(). String [] Vocabularies = getResources(). GetStringArray (R.array.Vocabularies_array); String [] meanings = getResources(). GetStringArray (R.array.meanings_array); Нарисуйте эту деталь под oncreate, просто объявите ее глобально. Контекст AS не инициализирован –

+0

Эти ответы, безусловно, помогли, моя ошибка была исправлена. Большое спасибо парни/девушки :) –

ответ

0

Попробуйте этот путь

@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

Эти ответы, безусловно, помогли, моя ошибка была исправлена. Спасибо много парней/девушек :) –

0

Попробуйте объявить свои массивы в глобальном контексте, то назначая им некоторое значение во время одного из этапов жизненного цикла на активность в (т.е. onCreate(), onResume() и т. д.).

Вопрос, который у вас есть, - getResources(). Я бы создал глобальную переменную типа Context. Тогда, что бы я сделал в onCreate() это:

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

Надежда, что помогает!

+0

Эти ответы, безусловно, помогли, моя ошибка была исправлена. Большое спасибо парни/девушки :) –

0

Эти переменные инициализацию ...

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

... наверное, нужно идти в конструкторе, или даже более вероятно, в onCreate(...), особенно после того, как

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

Инициализация переменных в некоторых метод, например oncreate/onPostcreated, например

@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 

} 
Смежные вопросы