无法从对话框中调用片段中的类

时间:2013-10-08 18:03:41

标签: android android-fragments

我似乎无法获得我当前的位置。在这个对话框的后半部分,我调用了一个名为MyLocation的类。我之前从未遇到任何麻烦。现在我尝试了几种不同的方法无济于事。但我相信我的麻烦在于背景。

这是第一次在片段中的AlertDialog中使用它。我认为这条线给我带来了麻烦。

myLocation.getLocation(context, locationResult);

我在公共视图onCreateView

中定义上下文
context = getActivity().getApplicationContext();

警报正在按预期工作,只是公共虚空getLocation似乎没有被调用。

 public void showLocationDialog() {
    new AlertDialog.Builder(this.getActivity()).setItems(C,
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialoginterface, int i) {
                    if (i == 0) {

                        LayoutInflater inflater = LayoutInflater
                                .from(getActivity());
                        final View textenter = inflater.inflate(
                                R.layout.dialog_location, null);
                        final EditText userinput = (EditText) textenter
                                .findViewById(R.id.etLocation);
                        final AlertDialog.Builder builder = new AlertDialog.Builder(
                                getActivity());
                        builder.setView(textenter).setTitle(
                                "Enter Location or where abouts");
                        builder.setPositiveButton("Set",
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(
                                            DialogInterface dialog, int id) {
                                        if (userinput != null){
                                            tvLocation.setText(userinput.getText().toString());  
                                            dialog.cancel();
                                        } else {
                                            dialog.cancel();
                                            showLocationDialog();
                                            Log.e("NULL", "Dismiss");
                                        }                           
                                    }
                                }).setNegativeButton("Cancel",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(
                                            DialogInterface dialog, int id) {
                                        dialog.cancel();
                                    }
                                });
                        builder.show();             
                    } else if (i == 1) {                 
                        LocationResult locationResult = new LocationResult() {
                            @Override
                            public void gotLocation(Location location) {             
                                // Got the location!
                                location.getLatitude();
                                location.getLongitude();

                                String loc = location.getLatitude() + ","
                                        + location.getLongitude();

                                etLocation.setText(loc);
                            }
                        };                           
                        MyLocation myLocation = new MyLocation();
                        myLocation.getLocation(context, locationResult);
                    }
                }
            }).show();
}

MyLocation:

public class MyLocation {
Timer timer1;
LocationManager lm;
LocationResult locationResult;
boolean gps_enabled = false;
boolean network_enabled = false;

public boolean getLocation(Context context, LocationResult result) {
    // I use LocationResult callback class to pass location value from
    // MyLocation to user code.
    locationResult = result;
    if (lm == null)
        lm = (LocationManager) context
                .getSystemService(Context.LOCATION_SERVICE);

    // exceptions will be thrown if provider is not permitted.
    try {
        gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
    } catch (Exception ex) {
    }
    try {
        network_enabled = lm
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    } catch (Exception ex) {
    }

    // don't start listeners if no provider is enabled
    if (!gps_enabled && !network_enabled)
        return false;

    if (gps_enabled)
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
                locationListenerGps);
    if (network_enabled)
        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,
                locationListenerNetwork);
    timer1 = new Timer();
    timer1.schedule(new GetLastLocation(), 20000);
    return true;
}

LocationListener locationListenerGps = new LocationListener() {
    public void onLocationChanged(Location location) {
        timer1.cancel();
        locationResult.gotLocation(location);
        lm.removeUpdates(this);
        lm.removeUpdates(locationListenerNetwork);
    }

    public void onProviderDisabled(String provider) {
    }

    public void onProviderEnabled(String provider) {
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
};

LocationListener locationListenerNetwork = new LocationListener() {
    public void onLocationChanged(Location location) {
        timer1.cancel();
        locationResult.gotLocation(location);
        lm.removeUpdates(this);
        lm.removeUpdates(locationListenerGps);
    }

    public void onProviderDisabled(String provider) {
    }

    public void onProviderEnabled(String provider) {
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
};

class GetLastLocation extends TimerTask {
    @Override
    public void run() {
        lm.removeUpdates(locationListenerGps);
        lm.removeUpdates(locationListenerNetwork);

        Location net_loc = null, gps_loc = null;
        if (gps_enabled)
            gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (network_enabled)
            net_loc = lm
                    .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

        // if there are both values use the latest one
        if (gps_loc != null && net_loc != null) {
            if (gps_loc.getTime() > net_loc.getTime())
                locationResult.gotLocation(gps_loc);
            else
                locationResult.gotLocation(net_loc);
            return;
        }

        if (gps_loc != null) {
            locationResult.gotLocation(gps_loc);
            return;
        }
        if (net_loc != null) {
            locationResult.gotLocation(net_loc);
            return;
        }
        locationResult.gotLocation(null);
    }
}

public static abstract class LocationResult {
    public abstract void gotLocation(Location location);
}
}

1 个答案:

答案 0 :(得分:0)

将您的片段与对话框相关联。


YourFragment.java

public class YourFragment extends Fragment {
    YourFragment mYourFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        mYourFragment = this;
        ...
    }
}

YourDialog.java

public class ClearDialogModern extends DialogFragment {
    YourFragment mContent;

    ...

public void setContent(YourFragment content) {
    mContent = content;
}

创建 YourDialog

newYourDialog = new YourDialog();
newYourDialog.setContent(mContent);

如何从 YourDragog.java 中的 YourFragment.java 获取位置:

mContent.getLocation();