使用服务类上的自定义按钮

时间:2014-11-30 13:14:31

标签: android android-activity android-service alertdialog

我为alertdiaog创建了一个自定义布局:alertdialog.setView(inflater.inflate(R.layout.custom_gps,null));

我想用我的按钮替换默认的Ok和取消按钮,因为它无法在服务类中使用findViewById,我想知道是否有解决方法来处理点击在我的自定义按钮上。 enter image description here

我看了一些旧的问题,但我没有找到(还)任何可以实现这一目标的技巧。你们能帮忙吗?

我还有另一种解决方法,就是扩展Activity而不是Service(这将使findViewByID可用,但我必须在课堂上应用哪些更改从活动开始服务?

欢迎任何帮助或指示!

public class GPSTracker extends Service implements LocationListener {

private final Context mcontext;
boolean isGPSEnabled = false;
boolean isNetworkEnabled = false;
boolean canGetLocation = false;
Location location;
double latitude,longitude;
private Button ok_button,cancel_button;


//the minimum distance to change updates in meters :
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10;
//the minimum time between updates (milliseconds) :
private static final long MIN_TIME_BETWEEN_UPDATE = 600000; // 10min

protected LocationManager locationmanager;

public GPSTracker (Context context){
    this.mcontext = context;
    getLocation();
}

public Location getLocation(){
    try {
        locationmanager = (LocationManager) mcontext
                .getSystemService(LOCATION_SERVICE);

        // getting GPS status
        isGPSEnabled = locationmanager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = locationmanager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
        } else {
            this.canGetLocation = true;
            // First get location from Network Provider
            if (isNetworkEnabled) {
                locationmanager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BETWEEN_UPDATE,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network");
                if (locationmanager != null) {
                    location = locationmanager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }
            // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
                if (location == null) {
                    locationmanager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            MIN_TIME_BETWEEN_UPDATE,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("GPS Enabled", "GPS Enabled");
                    if (locationmanager != null) {
                        location = locationmanager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return location;
}

/*
function to get latitude :
 */
public double getLatitude(){
    if(location != null){
        latitude = location.getLatitude();
    }
    return latitude;
}
/*
function to get longitude :
 */
public double getLongitude(){
    if (location != null){
        longitude = location.getLongitude();
    }
    return longitude;
}

/**
 *
 * function to check if gps is enabled
 * @return boolean
 *
 */
public boolean canGetlocation(){
    return this.canGetLocation;
}



/*
    function to show settings alert.
     */
public void showSettingsAlert(){

    AlertDialog.Builder alertdialog = new AlertDialog.Builder(mcontext);
    LayoutInflater inflater = LayoutInflater.from(mcontext);
    inflater = (LayoutInflater)mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    alertdialog.setView(inflater.inflate(R.layout.custom_gps,null));
    /*alertdialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            mcontext.startActivity(intent);


        }
    });

    // on pressing cancel button
   /* alertdialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });
*/
    alertdialog.show();

}
public void stopUsingGPS(){
    if(locationmanager != null){
        locationmanager.removeUpdates(GPSTracker.this);
    }
}
}

1 个答案:

答案 0 :(得分:1)

您可以创建一个简单的类,其中有一个显示对话框的方法,您需要非常简单地调用该方法.ex -

public class AlertDialog {

    public static void showdialog(Context context) {

        // custom dialog
        final Dialog dialog = new Dialog(context);
        dialog.setContentView(R.layout.custom);
        dialog.setTitle("Title...");
        // set the custom dialog components - text, image and button
        TextView text = (TextView) dialog.findViewById(R.id.text);
        text.setText("Android custom dialog example!");
        ImageView image = (ImageView) dialog.findViewById(R.id.image);
        image.setImageResource(R.drawable.ic_launcher);

        Button dialogButton = (Button) dialog.findViewById(R.id.dialogButtonOK);
        // if button is clicked, close the custom dialog
        dialogButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });

        dialog.show();

    }
}

现在在您的服务中,您可以通过传递上下文直接调用此方法。 像 -

AlertDialog.showdialog(context);