Ошибка диалога оповещения в приложении Android - PullRequest
0 голосов
/ 20 марта 2012

У меня проблемы с отображением предупреждения в моем приложении для Android. Цель состоит в том, чтобы отправить координаты GPS в базу данных, но сначала проверьте, находится ли пользователь в определенной области. Если пользователь находится за пределами области, я хочу отобразить предупреждение. У меня постоянно возникают проблемы на линии AlertDialog.Builder alert = new AlertDialog.Builder(this); с ошибкой The constructor AlertDialog.Builder(new LocationListener(){}) is undefined Ранее я задавал похожий вопрос, но решения не работали, и я думаю, что это потому, что мне не удалось включить достаточно кода. Буду признателен за любые предложения!

        import java.io.BufferedReader;

        public class FindLocation  {

        protected static final Context SendLocation = null;
        private LocationManager locManager;
        private LocationListener locListener;


        private class SendLocation extends AsyncTask<String, Void, String> {

            protected String doInBackground(String... params) {

                String lat = params[0];
                String lon = params[1];
                String usr_id2 = params[2];

                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://example.com/example.php");

                try {
                       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
                       nameValuePairs.add(new BasicNameValuePair("lat", lat)); 
                       nameValuePairs.add(new BasicNameValuePair("lon", lon));
                       nameValuePairs.add(new BasicNameValuePair("id", usr_id2));
                       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                       httpclient.execute(httppost);
                 } 
                 catch (ClientProtocolException e) {
                     // TODO Auto-generated catch block
                 } 
                 catch (IOException e) {
                     // TODO Auto-generated catch block
                 }
                return lon; 
            }
        }
        public void startLocation(Context context, String usr_id2) { //changed context to final when AlertDialog was added

            final String usr = usr_id2;

            //get a reference to the LocationManager
            locManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);


            //checked to receive updates from the position
            locListener = new LocationListener() {
                public void onLocationChanged(Location loc) {

                    String lat = String.valueOf(loc.getLatitude()); 
                    String lon = String.valueOf(loc.getLongitude());

                    Double latitude = loc.getLatitude();
                    Double longitude = loc.getLongitude();

                    if (latitude >= 39.15296 && longitude >= -86.547546 && latitude <= 39.184901 && longitude <= -86.504288) {
                            Log.i("Test", "Yes");                           
                            CityActivity check = new CityActivity();
                            check.checkDataBase(usr);

                            SendLocation task = new SendLocation();
                            task.execute(lat, lon, usr);
                    }
                    else {
                        Log.i("Test", "No");
                        AlertDialog.Builder alert = new AlertDialog.Builder(this); //****error here*****
                        alert.setTitle("Warning");
                        alert.setMessage("Sorry");
                        alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                           public void onClick(DialogInterface dialog, int which) {
                              // here you can add functions
                           }
                        });
                        alert.show();
                    }

                }
                public void onProviderDisabled(String provider){
                }
                public void onProviderEnabled(String provider){ 
                }
                public void onStatusChanged(String provider, int status, Bundle extras){
                    }
                };
                locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locListener);
            }

Ответы [ 3 ]

1 голос
/ 20 марта 2012

Вы объявляете свой AlertDialog в анонимном слушателе LocationListener. Если вы пытаетесь получить ссылку на Context в конструкторе, используя this, вы на самом деле будете ссылаться на LocationListener, а не на Context Activity. Используйте имя своей деятельности + this как ActivityName.this (если вы участвуете в активности) или получите реальную ссылку на Context.

EDIT:

В вашем классе FindLocation создайте конструктор, который принимает Context в качестве параметра, подобного этому:

//private field in your FindLocation class
Context ctx;

public FindLocation(Context ctx) {
     this.ctx = ctx;
}

Затем в Activity, где вы создаете экземпляр класса FindLocation, просто передайте this (или ActivityName.this)

FindLocation obj = new FindLocation(this);

Тогда вы можете использовать поле ctx для передачи в конструктор AlertDialog.

0 голосов
/ 20 марта 2012
AlertDialog.Builder alert = new AlertDialog.Builder(this);

вы назвали это внутри объекта new LocationListener () {.....} . И мы знаем, что этот представляет текущий объект, поэтому он выдает эту ошибку.

изменить параметр this на getApplicationContext () , поскольку определитель Builder определен для принятия Context

0 голосов
/ 20 марта 2012

Используйте этот фрагмент кода в соответствии с вашими потребностями для реализации окна предупреждения.

    public void alertbox(String title, String message,Activity activiy) {
    final AlertDialog alertDialog = new AlertDialog.Builder(activiy).create();
    alertDialog.setTitle(title);
    alertDialog.setMessage(message);
    alertDialog.setIcon(R.drawable.dashboard);
    alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int which) {
              alertDialog.cancel();      
        } });
    alertDialog.show();
 }

Это был мой код, поэтому ничего не изменилось, вы можете изменить в соответствии со своими потребностями. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...