2016-04-05 1 views
0

Ich mache eine App, um Daten aus einer Datenbank in einer Listenansicht anzuzeigen. Wenn auf ein Element in der Listenansicht geklickt wird, führt es den Benutzer zu einer neuen Aktivität, in der es weitere Details zu diesem Element anzeigen kann. Ich möchte die Detailseite dynamisch machen, um die Details anzuzeigen, und habe es geschafft, den Titel des Listenansichtselements in einem Toast anzuzeigen.So zeigen Sie in einem TextView-NullPointerException-Fehler übergebene Intent-Daten an

Nun, ich versuche, dies anzuzeigen, indem Sie setText(), um den Titel in einer Zeichenfolge zu zeigen, aber ich erhalte die Fehlermeldung:

AndroidRuntime: FATAL EXCEPTION: main 
     Process: com.example.kathe.parenttripapp, PID: 22849 
                      java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.kathe.parenttripapp/com.example.kathe.parenttripapp.Details}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.Serializable android.content.Intent.getSerializableExtra(java.lang.String)' on a null object reference 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2236) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                       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:5254) 
                       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 'java.io.Serializable android.content.Intent.getSerializableExtra(java.lang.String)' on a null object reference 
                       at com.example.kathe.parenttripapp.Details.<init>(Details.java:23) 
                       at java.lang.reflect.Constructor.newInstance(Native Method) 
                       at java.lang.Class.newInstance(Class.java:1606) 
                       at android.app.Instrumentation.newActivity(Instrumentation.java:1066) 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2226) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)  
                       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:5254)  
                       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)  

dies die Klasse der Fehler bei auftritt:

TextView titletext; 
final List<Activitytable> activityTable = Activitytable.listAll(Activitytable.class); 

String data = getIntent().getSerializableExtra("listPosition").toString(); 

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

    TextView titletext = (TextView) findViewById(R.id.titletext); 

    String data = getIntent().getSerializableExtra("listPosition").toString(); 

    Toast.makeText(getBaseContext(),String.valueOf(data),Toast.LENGTH_LONG).show(); 

    setData(); 
} 

private void setData() { 
    Intent i = getIntent(); 
    Bundle b = i.getExtras(); 
    if (data != null) { 
     String j = (String) b.get("listPosition"); 
     titletext.setText(j); 
    } 
    else{ 
     titletext.setText("Hello"); 
    } 
} 
Diese

ist die Aktivität hat es kommen:

final ListView listView = (ListView) findViewById(R.id.viewAll_listview); 
    long count = Activitytable.count(Activitytable.class); 

    if(count>0) { 
     final List<Activitytable> activitytable = Activitytable.listAll(Activitytable.class); 
     final ViewAllListView madapter = new ViewAllListView(getApplicationContext(), activitytable); 
     listView.setAdapter(madapter); 
     listView.setClickable(true); 
     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      public void onItemClick(AdapterView<?>parent, View v, int position, long id) { 
       String title = activitytable.get(position).Title.toString(); 
       Activitytable AT = Activitytable.findById(Activitytable.class,activitytable.get(position).getId()); 
       Intent i = new Intent(getApplicationContext(),Details.class); 
       i.putExtra("listPosition",title); 
       startActivity(i); 

      } 
      public Object getItem(int position) {return position;} 
     }); 

    } 
     else 

      { 
       Toast.makeText(getApplicationContext(), "No Data Available in Table", Toast.LENGTH_LONG); 
      } 
     } 

Was würde ich tun möchte, ist die Absicht zu setzen Daten in den TextView 'titeltext' eingeben und dann eine if-Anweisung ausführen, die besagt, ob die übergebenen Intent-Daten gleich einem Aktivitätstitel sind, dann zeigen sie die folgenden Daten an, können aber nicht herausfinden, was schief läuft. Ich habe versucht, mit getStringExtra() anstelle von getSerializableExtra, aber kein Glück. Funktioniert auf Toast, aber nicht auf TextView.

+0

@sihao Können Sie helfen? – kjones

+0

Diese Frage zu NullPointerExceptions wurde mehrmals gestellt: http://stackoverflow.com/q/218384/1478764. Bitte machen Sie ein wenig Recherche, bevor Sie eine Frage stellen. – chRyNaN

+0

Sie haben keine Absicht, deshalb ist 'getIntent() 'null. –

Antwort

1

Wenn Sie, warum Sie so tun, nicht etwas gutes Verständnis davon haben, versuchen Sie nicht, Ihre Variablen zu initialisieren, bis Sie in onCreate, auch um eine NullPointerException zu verhindern, ist es eine gute Angewohnheit, if (variable != null) zu verwenden.

Und Sie einen int speichern, so verwenden getIntExtra

TextView titletext; 
List<Activitytable> activityTable; 

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

    activityTable = Activitytable.listAll(Activitytable.class); 
    titletext = (TextView) findViewById(R.id.titletext); 

    Intent i = getIntent(); 
    if (i != null) { 
     String data = i.getStingExtra("listPosition"); 
     titletext.setText(String.valueOf(data)); 
    } 
} 
+0

Sie können auch darauf hinweisen, dass 'getSerializableExtra' auch null zurückgeben kann. So kann ein Aufruf von toString auch eine NullPointerException verursachen. – chRyNaN

+0

@chRyNaN Ich habe "getIntExtra" geändert, aber behoben. –

+0

Es mag nicht die ("listPosition") - es könnte gut sein, darauf hinzuweisen, dass listPosition Text nicht Ganzzahl anzeigen soll, wenn das hilft? ** Bearbeiten ** Änderte es in getStringExtra ("listPosition"), aber immer noch den gleichen Laufzeitfehler (nullPointerException) – kjones

-1

Der Null-Zeiger Sie empfangen sind in der Detailklasse auf der Leitung 23

at com.example.kathe.parenttripapp.Details.<init>(Details.java:23) 
0

In onCreate() und tun es nicht als Mitglied Variable.

Bundle intentBundle = getIntent().getExtras(); 
if (intentBundle != null) { 
     lastPosition = getInt("lastPostion"); 
}