Reputation: 21237
Seemingly very simple exercise, yet this somehow crashes my program. Trying to retrieve the string that the user enters into an EditText field. When I hit the submit button, I crash. Thanks again!
Here is the code and LogCat info:
public class FindEventsActivity extends Activity implements LocationListener {
GeoPoint searchFrom;
private static final int USE_CURRENT_COORDINATES = 0;
private static final int ENTER_CITY = 1;
private static final int ENTER_ZIP = 2;
private static final int USE_MAP = 3;
private static final int RESULT_FROM_MAP = 1;
Context context;
String cityState;
Geocoder geocoder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_find_events);
context = this;
setClickListeners();
}
private void setClickListeners() {
RelativeLayout locationBox = (RelativeLayout) findViewById(R.id.locationBox);
locationBox.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
final CharSequence[] methods = {"Use Current Location", "Enter City / State" , "Enter Zip Code", "Use Map"};
AlertDialog.Builder chooser = new AlertDialog.Builder(FindEventsActivity.this);
chooser.setTitle("Choose Your Search Location Method").setItems(methods, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int position) {
switch (position) {
case USE_CURRENT_COORDINATES:
searchFrom = getCurrentCoordinates();
break;
case ENTER_CITY:
searchFrom = getFromCityState();
break;
}
}
});
chooser.show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.find_events, menu);
return true;
}
private GeoPoint getCurrentCoordinates() {
if (isGooglePlay()) {
Location lastKnownLocation = getLastKnownLocation();
int lat = (int) (lastKnownLocation.getLatitude() * 1E6);
int lng = (int) (lastKnownLocation.getLongitude() * 1E6);
return new GeoPoint(lat, lng);
}
return null;
}
public void submitButtonOnClick(View view) {
System.err.println("inside onTouch");
EditText city_entry = (EditText) view.findViewById(R.id.city_entry);
Spinner state = (Spinner) findViewById(R.id.state_spinner);
System.err.println("here");
System.err.println(city_entry.getText().toString());
System.err.println("city string captured");
System.err.println(state.getSelectedItem().toString());
cityState = city_entry.getText().toString() + ", " + state.getSelectedItem().toString();
Toast.makeText(getApplicationContext(), cityState, Toast.LENGTH_LONG).show();
}
private GeoPoint getFromCityState() {
LayoutInflater inflater = LayoutInflater.from(this);
View view = inflater.inflate(R.layout.city_state_entry, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(view);
//setContentView(R.layout.city_state_entry);
//Button submitButton = (Button) findViewById(R.id.submitButton);
System.err.println("About to create onClickListener");
// create alert dialog
AlertDialog alertDialog = builder.create();
alertDialog.show();
return null;
}
@Override
public void onLocationChanged(Location arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub
}
private Location getLastKnownLocation() {
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
/* Verify that the gps is turned on */
if ( !locationManager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
buildAlertMessageNoGps();
}
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(false);
criteria.setPowerRequirement(Criteria.POWER_HIGH);
String provider = locationManager.getBestProvider(criteria, true);
if (provider == null) {
onProviderDisabled(null);
}
Location location = locationManager.getLastKnownLocation(provider);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 300000, 5000, this);
if (location != null) {
System.out.println("Provider " + provider + " has been selected.");
onLocationChanged(location);
return location;
}
return null;
}
private void buildAlertMessageNoGps() {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Your GPS seems to be disabled, do you want to enable it?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
dialog.cancel();
}
});
final AlertDialog alert = builder.create();
alert.show();
}
private boolean isGooglePlay() {
/* This function checks to make sure that the Google Play service is installed on the user's phone */
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (status != ConnectionResult.SUCCESS) {
((Dialog) GooglePlayServicesUtil.getErrorDialog(status, this, 10)).show();
//Toast.makeText(this, "Google Play Services is not available. Check your setup.", Toast.LENGTH_SHORT).show();
return false;
}
return true;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/city_state_entry"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@drawable/background"
android:padding="10dp" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/city_state_title"
android:textColor="#000000"
android:layout_gravity="center_horizontal"
android:paddingBottom="10dip"
/>
<TextView
android:id="@+id/enter_city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/enter_city" />
<EditText
android:id="@+id/city_entry"
android:inputType="textCapWords"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<requestFocus />
</EditText>
<TextView
android:id="@+id/enter_state"
android:layout_marginTop="10dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/select_state" />
<Spinner
android:id="@+id/state_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/state_abbreviations" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dip"
android:layout_gravity="center_horizontal"
android:paddingBottom="10dp">
<Button
android:id="@+id/submitButton"
style="@style/ButtonText"
android:onClick="submitButtonOnClick"
android:layout_gravity="center_horizontal"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:background="@drawable/blue_button"
android:text="@string/submit" />
</LinearLayout>
</LinearLayout>
05-19 19:23:56.703: W/System.err(4744): inside onTouch 05-19 19:23:56.703: W/System.err(4744): here 05-19 19:23:56.703: D/AndroidRuntime(4744): Shutting down VM 05-19 19:23:56.703: W/dalvikvm(4744): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0) 05-19 19:23:56.713: E/AndroidRuntime(4744): FATAL EXCEPTION: main 05-19 19:23:56.713: E/AndroidRuntime(4744): java.lang.IllegalStateException: Could not execute method of the activity 05-19 19:23:56.713: E/AndroidRuntime(4744): at android.view.View$1.onClick(View.java:2191) 05-19 19:23:56.713: E/AndroidRuntime(4744): at android.view.View.performClick(View.java:2532) 05-19 19:23:56.713: E/AndroidRuntime(4744): at android.view.View$PerformClick.run(View.java:9293) 05-19 19:23:56.713: E/AndroidRuntime(4744): at android.os.Handler.handleCallback(Handler.java:587) 05-19 19:23:56.713: E/AndroidRuntime(4744): at android.os.Handler.dispatchMessage(Handler.java:92) 05-19 19:23:56.713: E/AndroidRuntime(4744): at android.os.Looper.loop(Looper.java:150) 05-19 19:23:56.713: E/AndroidRuntime(4744): at android.app.ActivityThread.main(ActivityThread.java:4369) 05-19 19:23:56.713: E/AndroidRuntime(4744): at java.lang.reflect.Method.invokeNative(Native Method) 05-19 19:23:56.713: E/AndroidRuntime(4744): at java.lang.reflect.Method.invoke(Method.java:507) 05-19 19:23:56.713: E/AndroidRuntime(4744): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:846) 05-19 19:23:56.713: E/AndroidRuntime(4744): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604) 05-19 19:23:56.713: E/AndroidRuntime(4744): at dalvik.system.NativeStart.main(Native Method) 05-19 19:23:56.713: E/AndroidRuntime(4744): Caused by: java.lang.reflect.InvocationTargetException 05-19 19:23:56.713: E/AndroidRuntime(4744): at java.lang.reflect.Method.invokeNative(Native Method) 05-19 19:23:56.713: E/AndroidRuntime(4744): at java.lang.reflect.Method.invoke(Method.java:507) 05-19 19:23:56.713: E/AndroidRuntime(4744): at android.view.View$1.onClick(View.java:2186) 05-19 19:23:56.713: E/AndroidRuntime(4744): ... 11 more 05-19 19:23:56.713: E/AndroidRuntime(4744): Caused by: java.lang.NullPointerException 05-19 19:23:56.713: E/AndroidRuntime(4744): at com.mobilenicity.find_events.FindEventsActivity.submitButtonOnClick(FindEventsActivity.java:85) 05-19 19:23:56.713: E/AndroidRuntime(4744): ... 14 more
Upvotes: 0
Views: 2202
Reputation: 21237
I got it. The suggestion provided by @mvds got me thinking about the view relationship between getFromCityState() and submitButtonOnClick(). Both of these views present AlertDialogs, and it seems that there was a disconnect between them. Thus, when I attempted to retrieve the text from the EditText control, an error resulted.
I resolved it by creating a global view that I called builderView. I assigned that view in getFromCityState(). By making that view global, I wast then able to reference that same view in the submitButtonClick() method, thereby connecting these two functions.
(As an aside, the reason that I am using a separate function for my onClick comes from another problem I was having with being able to reference and change variables from an inner function.)
Here is the code for those two functions. I've left the old lines as comments so that people can see what I changed. If there are more elegant ways to do this, I'm all ears. Thanks everybody for all the suggestions!
View builderView;
AlertDialog alert;
private void getFromCityState() {
LayoutInflater inflater = LayoutInflater.from(this);
//View view = inflater.inflate(R.layout.city_state_entry, null);
builderView = inflater.inflate(R.layout.city_state_entry, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
//builder.setView(view);
builder.setView(builderView);
//AlertDialog alertDialog = builder.create();
alert = builder.create();
alert.show();
}
public void submitButtonOnClick(View view) {
EditText city_entry = (EditText) builderView.findViewById(R.id.city_entry);
Spinner state = (Spinner) builderView.findViewById(R.id.state_spinner);
cityState = city_entry.getText().toString() + ", " + state.getSelectedItem().toString();
System.err.println(cityState);
alert.dismiss();
geocoder = new Geocoder(this);
try {
List<Address> addresses = geocoder.getFromLocationName(cityState, 1);
/* the point of all of this is to set this GeoPoint value */
searchFrom = new GeoPoint( (int) (addresses.get(0).getLatitude() * 1E6), (int) (addresses.get(0).getLongitude() * 1E6) );
System.err.println("searchFrom: " + Integer.toString(searchFrom.getLatitudeE6()));
} catch (IOException e) {
e.printStackTrace();
}
}
Upvotes: 0
Reputation: 47034
The edittext is part of the dialog, and therefore not a child of the activity, nor a child of the pressed button (which is the View argument of the onclick method.
So you need to get/keep a hold of it, eg by assigning it to a field of your activity (quick&dirty). This in turn will give you some issues on rotation etc, but that's another topic. Making it a field should get you somewhere.
Upvotes: 1
Reputation: 284
Instead of using this
System.err.println(city_entry.getText().toString());
try this approach
System.err.println(""+city_entry.getText().toString());
Upvotes: 0
Reputation: 5246
Where & how are you calling the method submitButtonOnClick
? Think the view
is not found. Pass the view to the method submitButtonOnClick
when calling it and try the following...
Instead of...
EditText city_entry = (EditText) findViewById(R.id.city_entry);
Try...
EditText city_entry = (EditText) view.findViewById(R.id.city_entry);
Upvotes: 0