2015-05-28 11 views
5

aufzurufen Das Problem ist wie folgt. Ich habe eine Login-Aktivität (im Android Studio), die ein paar Tage zuvor funktioniert hat. Ich kann mich nicht daran erinnern, etwas geändert zu haben, aber als ich das letzte Mal ausgeführt habe, ist die App geschlossen worden, nachdem ich auf den Login-Button geklickt habe. Das letzte, was angezeigt wurde, war der Toast über die Vorausführung von AsyncTask. Und ich kann nicht verstehen, warum es eine NullPointerException geben könnte. Ich habe fast den gleichen Code für meine Anmeldung Aktivität und es funktioniert gut. Hier

ist das Protokoll:

05-28 16:04:52.395 1218-1232/system_process V/WindowManager﹕ addAppToken: AppWindowToken{5d89eb token=Token{23ccc93a ActivityRecord{2fe54865 u0 utanashati.reminder/.HomepageActivity t17}}} to stack=1 task=17 at 1 
05-28 16:04:52.407 19927-19927/utanashati.reminder D/AndroidRuntime﹕ Shutting down VM 
05-28 16:04:52.408 19927-19927/utanashati.reminder E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: utanashati.reminder, PID: 19927 
    java.lang.RuntimeException: Unable to start activity 
ComponentInfo{utanashati.reminder/utanashati.reminder.HomepageActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
      at android.app.ActivityThread.access$800(ActivityThread.java:151) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5257) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
      at utanashati.reminder.HomepageActivity.onCreate(HomepageActivity.java:55) 
      at android.app.Activity.performCreate(Activity.java:5990) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
            at android.app.ActivityThread.access$800(ActivityThread.java:151) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5257) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
05-28 16:04:52.410 1218-1232/system_process W/ActivityManager﹕ Force finishing activity 1 utanashati.reminder/.HomepageActivity 
05-28 16:04:52.411 1218-1232/system_process W/ActivityManager﹕ Force finishing activity 2 utanashati.reminder/.LoginActivity 

EDIT 1

Ich hatte mir die Augen geöffnet, ist das Problem nicht mit LoginActivity ist, aber mit HomepageActivity. Hier ist der Code:

import ... 

public class HomepageActivity extends Activity implements AdapterView.OnItemSelectedListener { 

    protected EditText mAddTaskText; 
    protected Spinner mPrioritySpinner; 
    protected Button mAddTaskButton; 
    protected int intPriority = 0; 
    protected String taskText; 
    protected Timestamp taskTimestamp; 
    protected Task userTask; 
    protected JsonGenerator taskJSON; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) {      // Starts activity. The state can be restored from savedInstanceState 
     super.onCreate(savedInstanceState);          // Calls the superclass method (IMPORTANT) 
     setContentView(R.layout.activity_homepage);        // Sets layout from activity_homepage.xml 

     mPrioritySpinner = (Spinner) findViewById(R.id.prioritySpinner);  // Creates an ArrayAdapter using the string array and a default spinner layout 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
       R.array.priorityList, android.R.layout.simple_spinner_item); // Specifies the layout to use when the list of choices appears 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);  // Applies the adapter to the spinner 
     mPrioritySpinner.setAdapter(adapter); 
     mPrioritySpinner.setOnItemSelectedListener(this); 

     mAddTaskText = (EditText) findViewById(R.id.addTaskEditText);   // Finds View by its id in .xml file 
     mAddTaskButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(HomepageActivity.this, "Done!", Toast.LENGTH_LONG).show(); 

       Calendar taskCalendar = Calendar.getInstance();    // Creates new calendar 
       long taskTime = taskCalendar.getTimeInMillis();    // Gets time in milliseconds 
       taskTimestamp = new Timestamp(taskTime);     // Creates new Timestamp 
       taskText = mAddTaskText.getText().toString();    // Gets description of the task 

       userTask.setDate(taskTimestamp);       // Sets date 
       userTask.setText(taskText);         // Sets text 

       /* Creating JsonGenerator */ 
       ObjectMapper mapper = new ObjectMapper(); 
       try { 
        mapper.writeValue(taskJSON, userTask); 
       } 
       catch (IOException e) { 
        Toast.makeText(HomepageActivity.this, "Could not create JSON", Toast.LENGTH_LONG).show(); 
       } 

       /* Getting out email and password */ 
       String userPassword = ((EmailPassword) HomepageActivity.this.getApplication()).getPassword(); 
       String userEmail = ((EmailPassword) HomepageActivity.this.getApplication()).getUserEmail(); 
       Toast.makeText(HomepageActivity.this, userEmail + " " + userPassword, Toast.LENGTH_LONG).show(); 

       /* HTTP stuff */ 
       HttpPoster get = new HttpPoster(); 
       get.execute(userEmail, userPassword, taskJSON.toString()); 
      } 
     }); 
    } 

    public int getData (String username, String password, String taskJSON) { 
     try { 
      HttpPost httpPost = new HttpPost("http://something.com/" + username + "/tasks"); 
      String dataToEncode = username + ":" + password; 
      String encodedData = Base64.encodeToString(dataToEncode.getBytes(), Base64.NO_WRAP); 
      httpPost.setHeader("Authorization", encodedData); 

      try { 
       StringEntity taskEntity = new StringEntity(taskJSON, "UTF-8"); 
       httpPost.setEntity(taskEntity); 
      } 
      catch (UnsupportedEncodingException e) { 
       Toast.makeText(HomepageActivity.this, "Unsupported encoding", Toast.LENGTH_LONG).show(); 
      } 

      HttpClient client = new DefaultHttpClient(); 
      HttpResponse response = client.execute(httpPost); 
      StatusLine statusLine = response.getStatusLine(); 
      int statusCode = statusLine.getStatusCode(); 
      if (statusCode == 200) { 
       return 1; 
      } 
      else if (statusCode == 404) { return 2; } 
      else if (statusCode == 500) { return 3; } 
      else if (statusCode == 409) { return 4; } 
      else { return statusCode; } 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return 0; 
    } 

    public void onItemSelected(AdapterView<?> parent, View view, 
           int pos, long id) { 
     String priority = parent.getItemAtPosition(pos).toString();    // Gets chosen priority 
     Toast.makeText(HomepageActivity.this, priority, Toast.LENGTH_LONG).show(); 
     while (!((priority.equals("Low")) || (priority.equals("Medium")) || (priority.equals("High")))) { 
      Toast.makeText(HomepageActivity.this, "Something bad happened. Try to choose again", Toast.LENGTH_LONG).show(); 
     } 
     if (priority.equals("Low")) { 
      intPriority = 0; 
     } 
     else if (priority.equals("Medium")) { 
      intPriority = 1; 
     } 
     else if (priority.equals("High")) { 
      intPriority = 2; 
     } 
     userTask.setPriority(intPriority);          // Sets chosen priority 
    } 

    public void onNothingSelected(AdapterView<?> parent) { 
     userTask.setPriority(intPriority);          // Sets default priority ("0") 
    } 

    public class HttpPoster extends AsyncTask<String, Void, Integer> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected Integer doInBackground(String... params) { 
      return getData(params[0], params[1], params[3]); 
     } 

     @Override 
     protected void onPostExecute(Integer result) { 
      super.onPostExecute(result); 
      if (result == 1) { 
       Toast.makeText(HomepageActivity.this, "Login successful", Toast.LENGTH_LONG).show(); 
       Intent takeUserHome = new Intent(HomepageActivity.this, HomepageActivity.class); 
       startActivity(takeUserHome); 
      } 
      else if (result == 2) { 
       Toast.makeText(HomepageActivity.this, "No such user", Toast.LENGTH_LONG).show(); 
      } 
      else if (result == 3) { 
       Toast.makeText(HomepageActivity.this, "Internal server error: unable to send email", Toast.LENGTH_LONG).show(); 
      } 
      else if (result == 4) { 
       Toast.makeText(HomepageActivity.this, "Task already exists", Toast.LENGTH_LONG).show(); 
      } 
      else { 
       Toast.makeText(HomepageActivity.this, result.toString(), Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 
} 

Und XML-Datei:

<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:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context="utanashati.testapp.HomepageActivity"> 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="Add a new task..." 
     android:id="@+id/addTaskEditText" 
     android:nestedScrollingEnabled="false" 
     android:minLines="1" 
     android:maxLines="1" /> 

    <Spinner 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/prioritySpinner" 
     android:layout_alignRight="@+id/addTaskButton" 
     android:layout_alignEnd="@+id/addTaskButton" 
     android:layout_below="@+id/addTaskEditText" /> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Add task" 
     android:id="@+id/addTaskButton" 
     android:layout_below="@+id/prioritySpinner" 
     android:layout_centerHorizontal="true" /> 

</RelativeLayout> 
+0

Die stacktrace Sie Punkte in 'zu einem Thema geschrieben HomepageActivity' nicht' LoginActivity', für die Sie geschrieben Code. –

+0

Ihr Fehler in der HomepageActivity-Aktivität, können Sie diesen Code hier eingeben. –

+0

@ci_ Wow, du hast meine Augen geöffnet, danke :) – Olesya

Antwort

6

mAddTaskButton ist null, weil Sie nie mit initialisieren:

mAddTaskButton = (Button) findViewById(R.id.addTaskButton); 

bevor Sie mAddTaskButton.setOnClickListener() nennen.

+3

Ich habe das gleiche Problem, aber ich habe es richtig initialisiert. –

5

Es scheint, dass die Schaltfläche, die Sie aufrufen, nicht in dem Layout ist, das Sie in setContentView(R.layout.your_layout) verwenden Versuchen Sie es.

-1

Das ist wahr, Mustafa .... seine working..its verweisen auf zwei Layout

  1. setContentView (R.layout.your_layout)
  2. v23 (your_layout).

Sie sollten Knopf beide Aktivität Layout nehmen ...
lösen dieses Problem erfolgreich

+0

Dies liefert keine Antwort auf die Frage. Sobald Sie genug [Reputation] (https://stackoverflow.com/help/whats-reputation) haben, können Sie [jeden Beitrag kommentieren] (https://stackoverflow.com/help/privileges/comment); Stattdessen [geben Sie Antworten, die keine Klärung durch den Fragesteller erfordern] (https://meta.stackexchange.com/questions/214173/why-doe-i-need-50-reputation-to-comment-what-can- i-do-stattdessen). - [Aus Bewertung] (/ review/low-quality-posts/17605173) – Shaido

Verwandte Themen