java - Android Fatal Exception occurring only on tablet -
i have project works fine in emulator in eclipse, not on actual nexus 7. it's supposed basic phone book app, far displays names saves in text file. when run on nexus, , tap "add" button, crashes. apparently saves data though, since if open again, data there. i've tried searching similar problems, haven't been able find any. here's logcat:
05-10 08:58:08.502: d/dalvikvm(16460): late-enabling checkjni 05-10 08:58:08.532: d/dalvikvm(16460): debugger has detached; object registry had 1 entries 05-10 08:58:08.682: d/libegl(16460): loaded /system/lib/egl/libegl_tegra.so 05-10 08:58:08.702: d/libegl(16460): loaded /system/lib/egl/libglesv1_cm_tegra.so 05-10 08:58:08.722: d/libegl(16460): loaded /system/lib/egl/libglesv2_tegra.so 05-10 08:58:08.752: d/openglrenderer(16460): enabling debug mode 0 05-10 08:58:26.612: d/dalvikvm(16460): gc_concurrent freed 212k, 5% free 7454k/7812k, paused 10ms+2ms, total 45ms 05-10 08:58:33.752: d/androidruntime(16460): shutting down vm 05-10 08:58:33.752: w/dalvikvm(16460): threadid=1: thread exiting uncaught exception (group=0x40d44930) 05-10 08:58:33.762: e/androidruntime(16460): fatal exception: main 05-10 08:58:33.762: e/androidruntime(16460): java.lang.nullpointerexception 05-10 08:58:33.762: e/androidruntime(16460): @ edu.mansfield.wardba21.phonebook.mainactivity$stablearrayadapter.getitemid(mainactivity.java:162) 05-10 08:58:33.762: e/androidruntime(16460): @ android.widget.abslistview.obtainview(abslistview.java:2180) 05-10 08:58:33.762: e/androidruntime(16460): @ android.widget.listview.measureheightofchildren(listview.java:1246) 05-10 08:58:33.762: e/androidruntime(16460): @ android.widget.listview.onmeasure(listview.java:1158) 05-10 08:58:33.762: e/androidruntime(16460): @ android.view.view.measure(view.java:15518) 05-10 08:58:33.762: e/androidruntime(16460): @ android.widget.relativelayout.measurechild(relativelayout.java:666) 05-10 08:58:33.762: e/androidruntime(16460): @ android.widget.relativelayout.onmeasure(relativelayout.java:477) 05-10 08:58:33.762: e/androidruntime(16460): @ android.view.view.measure(view.java:15518) 05-10 08:58:33.762: e/androidruntime(16460): @ android.view.viewgroup.measurechildwithmargins(viewgroup.java:4825) 05-10 08:58:33.762: e/androidruntime(16460): @ android.widget.framelayout.onmeasure(framelayout.java:310) 05-10 08:58:33.762: e/androidruntime(16460): @ android.view.view.measure(view.java:15518) 05-10 08:58:33.762: e/androidruntime(16460): @ android.widget.linearlayout.measurevertical(linearlayout.java:847) 05-10 08:58:33.762: e/androidruntime(16460): @ android.widget.linearlayout.onmeasure(linearlayout.java:588) 05-10 08:58:33.762: e/androidruntime(16460): @ android.view.view.measure(view.java:15518) 05-10 08:58:33.762: e/androidruntime(16460): @ android.view.viewgroup.measurechildwithmargins(viewgroup.java:4825) 05-10 08:58:33.762: e/androidruntime(16460): @ android.widget.framelayout.onmeasure(framelayout.java:310) 05-10 08:58:33.762: e/androidruntime(16460): @ com.android.internal.policy.impl.phonewindow$decorview.onmeasure(phonewindow.java:2176) 05-10 08:58:33.762: e/androidruntime(16460): @ android.view.view.measure(view.java:15518) 05-10 08:58:33.762: e/androidruntime(16460): @ android.view.viewrootimpl.performmeasure(viewrootimpl.java:1874) 05-10 08:58:33.762: e/androidruntime(16460): @ android.view.viewrootimpl.measurehierarchy(viewrootimpl.java:1089) 05-10 08:58:33.762: e/androidruntime(16460): @ android.view.viewrootimpl.performtraversals(viewrootimpl.java:1265) 05-10 08:58:33.762: e/androidruntime(16460): @ android.view.viewrootimpl.dotraversal(viewrootimpl.java:989) 05-10 08:58:33.762: e/androidruntime(16460): @ android.view.viewrootimpl$traversalrunnable.run(viewrootimpl.java:4351) 05-10 08:58:33.762: e/androidruntime(16460): @ android.view.choreographer$callbackrecord.run(choreographer.java:749) 05-10 08:58:33.762: e/androidruntime(16460): @ android.view.choreographer.docallbacks(choreographer.java:562) 05-10 08:58:33.762: e/androidruntime(16460): @ android.view.choreographer.doframe(choreographer.java:532) 05-10 08:58:33.762: e/androidruntime(16460): @ android.view.choreographer$framedisplayeventreceiver.run(choreographer.java:735) 05-10 08:58:33.762: e/androidruntime(16460): @ android.os.handler.handlecallback(handler.java:725) 05-10 08:58:33.762: e/androidruntime(16460): @ android.os.handler.dispatchmessage(handler.java:92) 05-10 08:58:33.762: e/androidruntime(16460): @ android.os.looper.loop(looper.java:137) 05-10 08:58:33.762: e/androidruntime(16460): @ android.app.activitythread.main(activitythread.java:5041) 05-10 08:58:33.762: e/androidruntime(16460): @ java.lang.reflect.method.invokenative(native method) 05-10 08:58:33.762: e/androidruntime(16460): @ java.lang.reflect.method.invoke(method.java:511) 05-10 08:58:33.762: e/androidruntime(16460): @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:793) 05-10 08:58:33.762: e/androidruntime(16460): @ com.android.internal.os.zygoteinit.main(zygoteinit.java:560) 05-10 08:58:33.762: e/androidruntime(16460): @ dalvik.system.nativestart.main(native method) from that, think looks layout, don't have idea how fix it. here's .xml:
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/relativelayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingbottom="@dimen/activity_vertical_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" tools:context=".mainactivity" > <listview android:id="@+id/listview1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignparentleft="true" android:layout_below="@+id/button1" android:layout_margintop="41dp" tools:listitem="@android:layout/simple_list_item_2" > </listview> <edittext android:id="@+id/edittext2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignbaseline="@+id/edittext1" android:layout_alignbottom="@+id/edittext1" android:layout_marginleft="69dp" android:layout_torightof="@+id/edittext1" android:ems="10" android:hint="number" android:inputtype="phone" /> <edittext android:id="@+id/edittext1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignleft="@+id/listview1" android:layout_alignparenttop="true" android:layout_marginleft="26dp" android:layout_margintop="24dp" android:ems="10" android:hint="name" android:inputtype="textpersonname" > <requestfocus /> </edittext> <button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignleft="@+id/edittext1" android:layout_below="@+id/edittext1" android:layout_marginleft="49dp" android:layout_margintop="21dp" android:text="add" android:textsize="36sp" /> <button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignbaseline="@+id/button1" android:layout_alignbottom="@+id/button1" android:layout_alignleft="@+id/edittext2" android:layout_marginleft="39dp" android:text="delete" android:textsize="36sp" /> </relativelayout> and here's java:
package edu.mansfield.wardba21.phonebook; import java.io.file; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; import java.io.outputstreamwriter; import java.util.arraylist; import java.util.hashmap; import java.util.list; import java.util.scanner; import android.os.bundle; import android.app.activity; import android.content.context; import android.support.v4.widget.simplecursoradapter; import android.view.layoutinflater; import android.view.menu; import android.view.view; import android.view.view.onclicklistener; import android.view.viewgroup; import android.widget.arrayadapter; import android.widget.button; import android.widget.edittext; import android.widget.listadapter; import android.widget.listview; import android.widget.textview; public class mainactivity extends activity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); button addbtn=(button)findviewbyid(r.id.button1); button delbtn=(button)findviewbyid(r.id.button2); final listview listview = (listview) findviewbyid(r.id.listview1); final arraylist<string> names = new arraylist<string>(); final arraylist<string> numbers = new arraylist<string>(); final edittext nameedit=(edittext) findviewbyid(r.id.edittext1); final edittext numbedit=(edittext) findviewbyid(r.id.edittext2); final file namefile = new file(getfilesdir() + file.separator + "names.txt"); final file numbfile = new file(getfilesdir() + file.separator + "numbers.txt"); if(!namefile.exists()) { try { namefile.createnewfile(); } catch (ioexception e1) { // todo auto-generated catch block e1.printstacktrace(); } } if(!numbfile.exists()) { try { numbfile.createnewfile(); } catch (ioexception e1) { // todo auto-generated catch block e1.printstacktrace(); } } try { scanner sc = new scanner(namefile); while(sc.hasnextline()) { names.add(sc.nextline()); } } catch (ioexception ioe) { system.out.println("failed load file"); } try { scanner sc = new scanner(numbfile); while(sc.hasnextline()) { numbers.add(sc.nextline()); } } catch (ioexception ioe) { system.out.println("failed load file"); } final stablearrayadapter adapter = new stablearrayadapter(this, android.r.layout.simple_list_item_1, names); listview.setadapter(adapter); addbtn.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { string name, number; name = nameedit.gettext().tostring(); number = numbedit.gettext().tostring(); if(!name.equals("") && !number.equals("")) { names.add(name); numbers.add(number); adapter.notifydatasetchanged(); try { fileoutputstream nameout = new fileoutputstream(namefile, true); outputstreamwriter osw = new outputstreamwriter(nameout); osw.write(name + "\n"); osw.flush(); osw.close(); fileoutputstream numbout = new fileoutputstream(numbfile, true); outputstreamwriter osw2 = new outputstreamwriter(numbout); osw2.write(number + "\n"); osw2.flush(); osw2.close(); } catch (filenotfoundexception e) { e.printstacktrace(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } } } }); delbtn.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { } }); } @override public boolean oncreateoptionsmenu(menu menu) { // inflate menu; adds items action bar if present. getmenuinflater().inflate(r.menu.main, menu); return true; } private class stablearrayadapter extends arrayadapter<string> { hashmap<string, integer> midmap = new hashmap<string, integer>(); public stablearrayadapter(context context, int textviewresourceid, list<string> objects) { super(context, textviewresourceid, objects); (int = 0; < objects.size(); ++i) { midmap.put(objects.get(i), i); } } @override public long getitemid(int position) { string item = getitem(position); return midmap.get(item); } @override public boolean hasstableids() { return true; } } }
"names" being used underlying arrayadapter dataset - when call adapter.notifydatasetchanged() telling adapter underlying data store has changed in someway , should try rebuild list.
unfortunately, getitemid(position) method of stablearrayadapter backed hashmap update when first constructing adapter.
so if add names, map doesn't updated reflect that... have nullpointerexceptions because map doesn't have corresponding object for:
return midmap.get(item);
Comments
Post a Comment