AndroidDev
AndroidDev

Reputation: 21237

EditText getText crashes

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

Answers (4)

AndroidDev
AndroidDev

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

mvds
mvds

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

test test
test test

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

neo108
neo108

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

Related Questions