我试图通过onMarkerClick将我插入数据库的数据显示到TextView。我还检查了this question以及其他问题和教程视频的解决方案,但我总是会收到此错误:
01-27 10:33:49.747 8287-8287/com.example.diana.ippv2 D/DatabaseHandler﹕ Database created
01-27 10:33:49.747 8287-8287/com.example.diana.ippv2 D/AndroidRuntime﹕ Shutting down VM
01-27 10:33:49.747 8287-8287/com.example.diana.ippv2 W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41d2d2a0)
01-27 10:33:49.757 8287-8287/com.example.diana.ippv2 E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.diana.ippv2/com.example.diana.ippv2.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2016)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117)
at android.app.ActivityThread.access$700(ActivityThread.java:134)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4867)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.app.Activity.findViewById(Activity.java:1859)
at com.example.diana.ippv2.MapFragment.<init>(MapFragment.java:20)
at com.example.diana.ippv2.MainActivity.<init>(MainActivity.java:10)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1319)
at android.app.Instrumentation.newActivity(Instrumentation.java:1068)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2007)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117)
at android.app.ActivityThread.access$700(ActivityThread.java:134)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4867)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
at dalvik.system.NativeStart.main(Native Method)
这是我的LotData课程
public class LotData
{
private String _address, _area, _utilities, _accessibility, _price;
private int _id;
public LotData(int id, String address, String area, String utilities, String accessibility, String price)
{
_id = id;
_address = address;
_area = area;
_utilities = utilities;
_accessibility = accessibility;
_price = price;
}
public int getId() { return _id; }
public String getAddress() { return _address; }
public String getArea() { return _area; }
public String getUtilities() { return _utilities; }
public String getAccessibility() { return _accessibility; }
public String getPrice() { return _price; }
}
DatabaseHandler类:
public class DatabaseHandler extends SQLiteOpenHelper
{
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "lotManager", TABLE_NAME = "lot_data", LOT_ID = "lot_id", LOT_ADDRESS = "lot_address", LOT_AREA = "lot_area", LOT_UTILITIES = "lot_utilities", LOT_ACCESSIBILITY = "lot_accessibility", LOT_PRICE = "lot_price";
public DatabaseHandler(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
Log.d("DatabaseHandler", "Database created");
}
//Creating tables
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL("CREATE TABLE" + TABLE_NAME + "(" + LOT_ID + "INTEGER PRIMARY KEY AUTOINCREMENT," + LOT_ADDRESS + "TEXT," + LOT_AREA + "TEXT," + LOT_UTILITIES + "TEXT," + LOT_ACCESSIBILITY + "TEXT," + LOT_PRICE + "TEXT");
Log.d("DatabaseHandler", "Table created");
}
//Upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("DROP TABLE IF EXISTS" + TABLE_NAME);
onCreate(db);
}
//Adding new data
public void addData(LotData lotData)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(LOT_ADDRESS, lotData.getAddress());
values.put(LOT_AREA, lotData.getArea());
values.put(LOT_UTILITIES, lotData.getUtilities());
values.put(LOT_ACCESSIBILITY, lotData.getAccessibility());
values.put(LOT_PRICE, lotData.getPrice());
db.insert(TABLE_NAME, null, values);
db.close();
}
//Retrieving data
public LotData getData(int id)
{
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, new String[] { LOT_ID, LOT_ADDRESS, LOT_AREA, LOT_UTILITIES, LOT_ACCESSIBILITY, LOT_PRICE }, LOT_ID + "=?", new String[]{ String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
LotData data = new LotData(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5));
db.close();
cursor.close();
return data;
}
//Deleting single data
public void deleteData (LotData lotData)
{
SQLiteDatabase db = getReadableDatabase();
db.delete(TABLE_NAME, LOT_ID + "=?", new String[] { String.valueOf(lotData.getId()) });
db.close();
}
//Updating single data from database
public int updateData(LotData lotData)
{
SQLiteDatabase db = getReadableDatabase();
ContentValues values = new ContentValues();
values.put(LOT_ADDRESS, lotData.getAddress());
values.put(LOT_AREA, lotData.getArea());
values.put(LOT_UTILITIES, lotData.getUtilities());
values.put(LOT_ACCESSIBILITY, lotData.getAccessibility());
values.put(LOT_PRICE, lotData.getPrice());
return db.update(TABLE_NAME, values, LOT_ID + "=?", new String[] { String.valueOf(lotData.getId()) });
}
public int getDataCount()
{
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
int count = cursor.getCount();
db.close();
cursor.close();
return count;
}
public List<LotData> getAllDatas()
{
List<LotData> dataList = new ArrayList<LotData>();
SQLiteDatabase db = getWritableDatabase();
Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
if (cursor.moveToFirst())
{
do
{
LotData data = new LotData(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5)); dataList.add(data);
}
while (cursor.moveToNext());
}
return dataList;
}
}
MapFragment类:
public class MapFragment extends FragmentActivity implements OnMapReadyCallback, OnMarkerClickListener
{
List<LotData> dataList;
DatabaseHandler dbHandler = new DatabaseHandler(this);
TextView lotAddress = (TextView) findViewById(R.id.addressTV);
TextView lotArea = (TextView) findViewById(R.id.areaTV);
TextView lotUtilities = (TextView) findViewById(R.id.utilTV);
TextView lotAccessibility = (TextView) findViewById(R.id.accsTV);
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.map_layout);
SupportMapFragment sMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
sMapFragment.getMapAsync(this);
Log.d("Insert: ", "Inserting data..");
dbHandler.addData(new LotData(1, "Jaro Iloilo", "24", "Water and Electrical Supply", "Market, Hospital, Police Station," + "School", "Unknown"));
Log.d("Reading: ", "Reading all lot data..");
dataList = dbHandler.getAllDatas();
for (LotData lotData : dataList)
{
String log = "ID: " + lotData.getId() + "Address: " + lotData.getAddress() + "Area: " + lotData.getArea() + "Utilities: " + lotData.getUtilities() + "Accessibility: " + lotData.getAccessibility() + "Price: " + lotData.getPrice();
//Writing to log
Log.d("Address: ", log);
}
}
@Override
public void onMapReady(GoogleMap mMap)
{
LatLng one = new LatLng(10.7187530, 122.5611620);
LatLng ILOILO = new LatLng(10.730278, 122.548889);
mMap.setBuildingsEnabled(true);
mMap.setMyLocationEnabled(true);
mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(ILOILO, 12));
Marker oneJRD = mMap.addMarker(new MarkerOptions()
.title("Lot ID: 0115-0001JRD")
.snippet("Click for more info")
.position(one)
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
oneJRD.showInfoWindow();
mMap.setOnMarkerClickListener(this);
}
@Override
public boolean onMarkerClick (Marker oneJRD)
{
setContentView(R.layout.info_layout);
LotData lotData = dbHandler.getData(0);
lotAddress.setText("Address: " + lotData.getAddress());
lotArea.setText("Area: " + lotData.getArea());
lotUtilities.setText("Utilities: " + lotData.getUtilities());
lotAccessibility.setText("Accessibility: " + lotData.getAccessibility());
return false;
}
}
答案 0 :(得分:0)
在设置活动视图之前使用findviewbyid。如果你希望那些变量是全局变量,你必须这样做。
public class MapFragment extends FragmentActivity implements OnMapReadyCallback, OnMarkerClickListener
{
List<LotData> dataList;
DatabaseHandler dbHandler = new DatabaseHandler(this);
TextView lotAddress;
TextView lotArea;
TextView lotUtilities;
TextView lotAccessibility;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.map_layout);
lotAddress = (TextView) findViewById(R.id.addressTV);
lotArea = (TextView) findViewById(R.id.areaTV);
lotUtilities = (TextView) findViewById(R.id.utilTV);
lotAccessibility = (TextView) findViewById(R.id.accsTV);
SupportMapFragment sMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
sMapFragment.getMapAsync(this);
Log.d("Insert: ", "Inserting data..");
dbHandler.addData(new LotData(1, "Jaro Iloilo", "24", "Water and Electrical Supply", "Market, Hospital, Police Station," + "School", "Unknown"));
Log.d("Reading: ", "Reading all lot data..");
dataList = dbHandler.getAllDatas();
for (LotData lotData : dataList)
{
String log = "ID: " + lotData.getId() + "Address: " + lotData.getAddress() + "Area: " + lotData.getArea() + "Utilities: " + lotData.getUtilities() + "Accessibility: " + lotData.getAccessibility() + "Price: " + lotData.getPrice();
//Writing to log
Log.d("Address: ", log);
}
}
@Override
public void onMapReady(GoogleMap mMap)
{
LatLng one = new LatLng(10.7187530, 122.5611620);
LatLng ILOILO = new LatLng(10.730278, 122.548889);
mMap.setBuildingsEnabled(true);
mMap.setMyLocationEnabled(true);
mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(ILOILO, 12));
Marker oneJRD = mMap.addMarker(new MarkerOptions()
.title("Lot ID: 0115-0001JRD")
.snippet("Click for more info")
.position(one)
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
oneJRD.showInfoWindow();
mMap.setOnMarkerClickListener(this);
}
@Override
public boolean onMarkerClick (Marker oneJRD)
{
setContentView(R.layout.info_layout);
LotData lotData = dbHandler.getData(0);
lotAddress.setText("Address: " + lotData.getAddress());
lotArea.setText("Area: " + lotData.getArea());
lotUtilities.setText("Utilities: " + lotData.getUtilities());
lotAccessibility.setText("Accessibility: " + lotData.getAccessibility());
return false;
}
}
答案 1 :(得分:0)
在设置活动布局之前无法使用某些方法。其中一种方法是findViewById
。这需要在setContentView()
像这样改变
public class MapFragment extends FragmentActivity implements OnMapReadyCallback, OnMarkerClickListener
{
List<LotData> dataList;
DatabaseHandler dbHandler = null;
TextView lotAddress;
TextView lotArea;
TextView lotUtilities;
TextView lotAccessibility;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.map_layout);
dbHandler = new DatabaseHandler(this);
lotAddress = (TextView) findViewById(R.id.addressTV);
lotArea = (TextView) findViewById(R.id.areaTV);
lotUtilities = (TextView) findViewById(R.id.utilTV);
lotAccessibility = (TextView) findViewById(R.id.accsTV);
SupportMapFragment sMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
sMapFragment.getMapAsync(this);
Log.d("Insert: ", "Inserting data..");
dbHandler.addData(new LotData(1, "Jaro Iloilo", "24", "Water and Electrical Supply", "Market, Hospital, Police Station," + "School", "Unknown"));
Log.d("Reading: ", "Reading all lot data..");
dataList = dbHandler.getAllDatas();
for (LotData lotData : dataList)
{
String log = "ID: " + lotData.getId() + "Address: " + lotData.getAddress() + "Area: " + lotData.getArea() + "Utilities: " + lotData.getUtilities() + "Accessibility: " + lotData.getAccessibility() + "Price: " + lotData.getPrice();
//Writing to log
Log.d("Address: ", log);
}
}
@Override
public void onMapReady(GoogleMap mMap)
{
LatLng one = new LatLng(10.7187530, 122.5611620);
LatLng ILOILO = new LatLng(10.730278, 122.548889);
mMap.setBuildingsEnabled(true);
mMap.setMyLocationEnabled(true);
mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(ILOILO, 12));
Marker oneJRD = mMap.addMarker(new MarkerOptions()
.title("Lot ID: 0115-0001JRD")
.snippet("Click for more info")
.position(one)
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
oneJRD.showInfoWindow();
mMap.setOnMarkerClickListener(this);
}
@Override
public boolean onMarkerClick (Marker oneJRD)
{
setContentView(R.layout.info_layout);
LotData lotData = dbHandler.getData(0);
lotAddress.setText("Address: " + lotData.getAddress());
lotArea.setText("Area: " + lotData.getArea());
lotUtilities.setText("Utilities: " + lotData.getUtilities());
lotAccessibility.setText("Accessibility: " + lotData.getAccessibility());
return false;
}
}