-1

根據錯誤消息,我明顯覆蓋了main中的onLocationchanged方法,但它一直說你必須實現該方法。我知道這個聽衆也有更多的3種方法。當我嘗試重寫這些時,它說「方法不會覆蓋超類的方法」。片段不是抽象的,也不會覆蓋LocationListener中的抽象方法onLocationChanged(Location)

無論哪種方式,我無法解決問題。

這裏是片段級。

package com.example.mudasir.login.fragments; 


import android.Manifest; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.pm.PackageManager; 
import android.content.res.Resources; 
import android.location.Address; 
import android.location.Geocoder; 
import android.location.Location; 
import android.location.LocationManager; 
import android.media.audiofx.AudioEffect; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

import com.example.mudasir.login.R; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.maps.CameraUpdate; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.LatLngBounds; 
import com.google.android.gms.maps.model.Marker; 
import com.google.android.gms.maps.model.MarkerOptions; 

import java.io.IOException; 
import java.util.List; 


/** 
* A simple {@link Fragment} subclass. 
*/ 
public class LocatorsFragment extends Fragment implements OnMapReadyCallback, View.OnClickListener, LocationListener { 

    private GoogleMap mMap; 
    private Button btnShowroom; 
    private Button btnService; 
    private Button btnParts; 
    private Button btnGas; 
    private Button btnAtm; 
    private Button btnSearch; 
    private EditText searchQuery; 


    Resources stringArrayResource; 
    private String[] showroomAddresses; 
    private String[] serviceAddresses; 
    private String[] partsAddresses; 
    private String searchQueryString; 
    private android.location.Address address = null; 
    List<Address> addressList = null; 

    LatLng latLng; 
    Geocoder geocoder; 
    Marker marker; 
    LatLngBounds bounds; 
    CameraUpdate cu; 
    ProgressDialog dialog; 
    boolean flag = false; 

    private LocationManager locationManager; 
    private LocationListener locationListener; 

    public LocatorsFragment() { 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_maps_, container, false); 
     locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); 
     locationListener = new LocationListener() { 
      @Override 
      public void onLocationChanged(Location location) { 
       latLng = new LatLng((double) location.getLatitude(), (double) location.getLongitude()); 
       marker = mMap.addMarker(new MarkerOptions().position(latLng).title("Pin 1")); 
      } 
     }; 


     initUI(view); 
     return view; 
    } 

    private void initUI(View view) { 
     btnShowroom = (Button) view.findViewById(R.id.btn_showroom); 
     btnService = (Button) view.findViewById(R.id.btn_service); 
     btnParts = (Button) view.findViewById(R.id.btn_parts); 
     btnGas = (Button) view.findViewById(R.id.btn_gas); 
     btnAtm = (Button) view.findViewById(R.id.btn_atm); 
     btnSearch = (Button) view.findViewById(R.id.btn_search); 
     searchQuery = (EditText) view.findViewById(R.id.editext_search); 

     btnShowroom.setOnClickListener(this); 
     btnService.setOnClickListener(this); 
     btnParts.setOnClickListener(this); 
     btnGas.setOnClickListener(this); 
     btnAtm.setOnClickListener(this); 
     btnSearch.setOnClickListener(this); 

     stringArrayResource = getActivity().getResources(); 
     showroomAddresses = stringArrayResource.getStringArray(R.array.showroom_array); 
     serviceAddresses = stringArrayResource.getStringArray(R.array.service_array); 
     partsAddresses = stringArrayResource.getStringArray(R.array.parts_array); 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.maps); 
     mapFragment.getMapAsync(this); 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 




//  if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
//   // TODO: Consider calling 
//   // ActivityCompat#requestPermissions 
//   // here to request the missing permissions, and then overriding 
//   // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
//   //           int[] grantResults) 
//   // to handle the case where the user grants the permission. See the documentation 
//   // for ActivityCompat#requestPermissions for more details. 
//  } 
//  mMap.setMyLocationEnabled(true); 
    } 

    public void render_Map(String[] addresses,LatLngBounds.Builder builder) 
    { 
     //mMap.clear(); 
     geocoder = new Geocoder(getActivity()); 
     for (int i = 0; i < 5; i++) { 
      try { 
       addressList = geocoder.getFromLocationName(addresses[i], 1); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      address = addressList.get(0); 
      latLng = new LatLng(address.getLatitude(), address.getLongitude()); 
      marker = mMap.addMarker(new MarkerOptions().position(latLng).title(addresses[i])); 
      builder.include(marker.getPosition()); 
     } 

     bounds = builder.build(); 
     int padding = 0; 
     cu = CameraUpdateFactory.newLatLngBounds(bounds, padding); 
     mMap.animateCamera(cu); 
    } 
    @Override 
    public void onClick(View view) { 
     switch(view.getId()) { 
      case R.id.btn_showroom: 

      //new ShowProgressBar().execute("abc",null,null); 

       LatLngBounds.Builder builder1 = new LatLngBounds.Builder(); 
       render_Map(showroomAddresses,builder1); 
       flag = true; 
      // dialog.cancel(); 
       break; 

      case R.id.btn_service: 

       LatLngBounds.Builder builder2 = new LatLngBounds.Builder(); 
       render_Map(serviceAddresses,builder2); 
       break; 

      case R.id.btn_parts: 

       LatLngBounds.Builder builder3 = new LatLngBounds.Builder(); 
       render_Map(partsAddresses,builder3); 
       break; 

      case R.id.btn_gas: 

       Toast.makeText(getActivity(),getString(R.string.in_progress_text), Toast.LENGTH_SHORT).show(); 
       break; 

      case R.id.btn_atm: 

       Toast.makeText(getActivity(),getString(R.string.in_progress_text), Toast.LENGTH_SHORT).show(); 
       break; 

      case R.id.btn_search: 

       searchQueryString = searchQuery.getText().toString(); 
       List<Address> addressList1 = null; 

       if(searchQueryString != null && !searchQueryString.equals("")) 
       { 
        geocoder = new Geocoder(getContext()); 
        try { 
         addressList1 = geocoder.getFromLocationName(searchQueryString, 1); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        address = addressList1.get(0); 
        latLng = new LatLng(address.getLatitude(), address.getLongitude()); 
        mMap.addMarker(new MarkerOptions().position(latLng).title(searchQueryString)); 
        mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng)); 
       } 
       else{ 

        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
         // TODO: Consider calling 
         // ActivityCompat#requestPermissions 
         // here to request the missing permissions, and then overriding 
         // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
         //           int[] grantResults) 
         // to handle the case where the user grants the permission. See the documentation 
         // for ActivityCompat#requestPermissions for more details. 
         //return TODO; 
        } 
        locationManager.requestLocationUpdates(locationManager.GPS_PROVIDER, 0, 0, (android.location.LocationListener) locationListener); 
        Toast.makeText(getActivity(),getString(R.string.missing_search_query_error_message), Toast.LENGTH_SHORT).show();} 
       break; 

     } 
    } 


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

     @Override 
     protected void onPreExecute() { 
      dialog = ProgressDialog.show(getActivity(), "", 
        "Loading. Please wait...", true); 
     } 

     @Override 
     protected Void doInBackground(String... strings) { 

     while (!flag == true) 
     { 
     } 
      return null; 
     } 

     @Override 

     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      dialog.dismiss(); 

     } 
    } 
} 

的logcat:

Information:Gradle tasks [:app:assembleDebug] 
C:\Users\mudasir\AndroidStudioProjects\BasicSampleApplication\app\src\main\java\com\example\mudasir\login\fragments\LocatorsFragment.java 
Error:(45, 8) error: LocatorsFragment is not abstract and does not override abstract method onLocationChanged(Location) in LocationListener 
Error:Execution failed for task ':app:compileDebugJavaWithJavac'. 
> Compilation failed; see the compiler error output for details. 
Information:BUILD FAILED 
Information:Total time: 6.188 secs 
Information:2 errors 
Information:0 warnings 
Information:See complete output in console 

堆棧跟蹤:

11-18 17:32:17.347 10630-10630/com.example.mudasir.login E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.example.mudasir.login, PID: 10630 
                      java.lang.ClassCastException: com.example.mudasir.login.fragments.LocatorsFragment$1 cannot be cast to android.location.LocationListener 
                       at com.example.mudasir.login.fragments.LocatorsFragment.onClick(LocatorsFragment.java:230) 
                       at android.view.View.performClick(View.java:4766) 
                       at android.view.View$PerformClick.run(View.java:19683) 
                       at android.os.Handler.handleCallback(Handler.java:739) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:135) 
                       at android.app.ActivityThread.main(ActivityThread.java:5538) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at java.lang.reflect.Method.invoke(Method.java:372) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
+0

附加logcat的輸出以及 – Neji

+0

logcat的更新。 –

回答

1

您需要在LocatorsFragment類覆蓋onLocationChanged()也一樣,因爲它實現LocationListener的。

+0

是啊,我實現在locatorsFragment的onLocationChanged()。此代碼是LocatorsFragment類。 –

2

你正在創建an anonymous classimplements LocationListener但你LocatorsFragment不會覆蓋onLocationChanged

因爲它似乎是你正在做你的匿名類的onLocationChanged工作,只是從你的LocatorsFragment刪除implements LocationListener

public class LocatorsFragment extends Fragment implements OnMapReadyCallback, View.OnClickListener { 
+0

如果我刪除,它拋出一個異常。 java.lang.ClassCastException:com.example.mudasir.login.fragments.LocatorsFragment $ 1無法轉換爲android.location.LocationListener –

+0

有什麼異常? – antonio

+0

java.lang.ClassCastException:com.example.mudasir.login.fragments.LocatorsFragment $ 1無法轉換爲android.location.LocationListener –

相關問題