0

一見非常に単純な演習ですが、これはどういうわけか私のプログラムをクラッシュさせます。ユーザーが 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: キャッチされない例外で終了するスレッド (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: アクティビティのメソッドを実行できませんでした 05-19 19:23:56.713: E/AndroidRuntime( 4744): android.view.View$1.onClick(View.java:2191) 05-19 19:23:56.713: E/AndroidRuntime(4744): android.view.View.performClick(View.java:2532) で05-19 19:23:56.713: E/AndroidRuntime(4744): 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): android.os.Handler.dispatchMessage(Handler.java:92) 05-19 19:23:56.713: E/AndroidRuntime(4744) : android.os.Looper.loop(Looper.java:150) 05-19 19:23:56.713: E/AndroidRuntime(4744): android.app.ActivityThread.main(ActivityThread.java:4369) 05-19 19:23:56.713: E/AndroidRuntime(4744): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) 05-19 19:23:56.713: E/AndroidRuntime(4744): java.lang.reflect で。 Method.invoke(Method.java:507) 05-19 19:23:56.713: E/AndroidRuntime(4744): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:846) 05-19 で19:23:56.713: E/AndroidRuntime(4744): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604) 05-19 19:23:56.713: E/AndroidRuntime(4744): dalvik で。システム。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(ネイティブ メソッド) 05-19 19:23:56.713: E/AndroidRuntime(4744): 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): 原因: java.lang.NullPointerException 05-19 19:23:56.713: E/AndroidRuntime(4744): com.mobilenicity.find_events.FindEventsActivity.submitButtonOnClick( FindEventsActivity.java:85) 05-19 19:23:56.713: E/AndroidRuntime(4744): ... 14 もっと見る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): java.lang.reflect.Method.invoke(Method.java:507) 05-19 19:23:56.713: E/AndroidRuntime(4744): 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): 原因by: java.lang.NullPointerException 05-19 19:23:56.713: E/AndroidRuntime(4744): com.mobilenicity.find_events.FindEventsActivity.submitButtonOnClick(FindEventsActivity.java:85) 05-19 19:23:56.713: E /AndroidRuntime(4744): ... 14 件以上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): java.lang.reflect.Method.invoke(Method.java:507) 05-19 19:23:56.713: E/AndroidRuntime(4744): 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): 原因by: java.lang.NullPointerException 05-19 19:23:56.713: E/AndroidRuntime(4744): com.mobilenicity.find_events.FindEventsActivity.submitButtonOnClick(FindEventsActivity.java:85) 05-19 19:23:56.713: E /AndroidRuntime(4744): ... 14 件以上java.lang.reflect.Method.invokeNative(ネイティブ メソッド) 05-19 19:23:56.713: E/AndroidRuntime(4744): java.lang.reflect.Method.invoke(Method.java:507) 05-19 で19:23:56.713: E/AndroidRuntime(4744): 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): com.mobilenicity.find_events.FindEventsActivity.submitButtonOnClick で(FindEventsActivity.java:85) 05-19 19:23:56.713: E/AndroidRuntime(4744): ... 14 もっと見るjava.lang.reflect.Method.invokeNative(ネイティブ メソッド) 05-19 19:23:56.713: E/AndroidRuntime(4744): java.lang.reflect.Method.invoke(Method.java:507) 05-19 で19:23:56.713: E/AndroidRuntime(4744): 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): com.mobilenicity.find_events.FindEventsActivity.submitButtonOnClick で(FindEventsActivity.java:85) 05-19 19:23:56.713: E/AndroidRuntime(4744): ... 14 もっと見る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): com.mobilenicity.find_events.FindEventsActivity.submitButtonOnClick(FindEventsActivity.java:85) 05-19 19:23:56.713: E/AndroidRuntime(4744 ): ... 14 以上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): com.mobilenicity.find_events.FindEventsActivity.submitButtonOnClick(FindEventsActivity.java:85) 05-19 19:23:56.713: E/AndroidRuntime(4744 ): ... 14 以上

4

4 に答える 4

1

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.

于 2013-05-20T14:19:00.823 に答える
0

わかった。@mvds からの提案により、getFromCityState() と submitButtonOnClick() の間のビューの関係について考えるようになりました。これらのビューはどちらも AlertDialogs を示しており、両者の間に切断があったようです。そのため、EditText コントロールからテキストを取得しようとすると、エラーが発生しました。

builderView というグローバル ビューを作成することで解決しました。getFromCityState() でそのビューを割り当てました。そのビューをグローバルにすることで、submitButtonClick() メソッドで同じビューを参照できるようになり、これら 2 つの関数が接続されました。

(余談ですが、onClick に別の関数を使用している理由は、内部関数から変数を参照および変更できるという別の問題に起因しています。)

これら 2 つの関数のコードを次に示します。古い行をコメントとして残して、変更内容を人々が確認できるようにしました。これを行うためのよりエレガントな方法があれば、私はすべて耳にします。すべての提案をありがとう!

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

}
于 2013-05-20T16:25:28.453 に答える
0

どこでどのようにメソッドを呼び出していますsubmitButtonOnClickか? viewが見つからないと考えてください。メソッドを呼び出すときにビューをメソッドに渡し、submitButtonOnClick次のことを試してください...

それ以外の...

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

試す...

EditText city_entry = (EditText) view.findViewById(R.id.city_entry); 
于 2013-05-20T01:43:16.663 に答える