EditText getText崩溃

时间:2013-05-20 01:35:17

标签: android android-edittext

看似非常简单的运动,但这会以某种方式使我的程序崩溃。尝试检索用户输入EditText字段的字符串。当我点击提交按钮时,我崩溃了。再次感谢!

以下是代码和LogCat信息:

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):onTouch 05-19内   19:23:56.703:W / System.err(4744):这里05-19 19:23:56.703:   D / AndroidRuntime(4744):关闭VM 05-19 19:23:56.703:   W / dalvikvm(4744):threadid = 1:线程退出未捕获的异常   (组= 0x4001d5a0)05-19 19:23:56.713:E / AndroidRuntime(4744):致命   例外:主05-19 19:23:56.713:E / AndroidRuntime(4744):   java.lang.IllegalStateException:无法执行的方法   活动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):引起:   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更多05-19 19:23:56.713:   E / AndroidRuntime(4744):引起: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更多

4 个答案:

答案 0 :(得分:1)

edittext是对话框的一部分,因此不是活动的子项,也不是按下按钮的子项(这是onclick方法的View参数。

所以你需要得到/保持它,例如通过将它分配到你的活动领域(快速和肮脏)。这反过来会给你一些旋转等问题,但那是另一个话题。把它变成一个领域应该可以让你到达某个地方。

答案 1 :(得分:0)

哪里&amp;你是如何调用方法submitButtonOnClick的?认为找不到view。调用视图时将视图传递给方法submitButtonOnClick并尝试以下操作...

而不是......

EditText city_entry = (EditText) findViewById(R.id.city_entry);

...试

EditText city_entry = (EditText) view.findViewById(R.id.city_entry); 

答案 2 :(得分:0)

而不是使用此

 System.err.println(city_entry.getText().toString());

尝试这种方法

 System.err.println(""+city_entry.getText().toString());

答案 3 :(得分:0)

我明白了。 @mvds提供的建议让我想到了getFromCityState()和submitButtonOnClick()之间的视图关系。这两个视图都呈现AlertDialogs,似乎它们之间存在脱节。因此,当我尝试从EditText控件中检索文本时,会出现错误。

我通过创建一个名为builderView的全局视图来解决它。我在getFromCityState()中分配了该视图。通过使该视图成为全局视图,我可以在submitButtonClick()方法中引用相同的视图,从而连接这两个函数。

(顺便说一下,我为onClick使用单独函数的原因来自于我能够从内部函数引用和更改变量的另一个问题。)

这是这两个函数的代码。我把旧行留作评论,以便人们可以看到我改变了什么。如果有更优雅的方法来做到这一点,我会全力以赴。感谢大家提出的所有建议!

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();
    }

}