2013-07-02 9 views
7

Mam do czynienia z mapami apiv2. I pojawia się następujący błąd podczas kodowania klasy Fragment dialogu.Błąd innych niż domyślne konstruktorów w fragmentach

Error :Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead:

Jest to kod:

public PlaceDialogFragment(){ 
    super(); 
} 

public PlaceDialogFragment(Place place, DisplayMetrics dm){ 
    super(); 
    this.mPlace = place; 
    this.mMetrics = dm; 
} 

Każda pomoc wud być doceniane ..

Revised: To jest cały kod ... I m rodzaj początkujących i nigdy zanim zajrzałem do fragmentów .. Przechodziłem przez tutuł mapy i znalazłem to .. możesz rozwinąć teraz, kiedy próbowałeś wytłumaczyć ..

package com.example.travelplanner; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.util.DisplayMetrics; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.widget.ViewFlipper; 

// Defining DialogFragment class to show the place details with photo 
public class PlaceDialogFragment extends DialogFragment{ 

    TextView mTVPhotosCount = null; 
    TextView mTVVicinity = null; 
    ViewFlipper mFlipper = null; 
    Place mPlace = null; 
    DisplayMetrics mMetrics = null; 

    public PlaceDialogFragment(){ 
     super(); 
    } 

    public PlaceDialogFragment(Place place, DisplayMetrics dm){ 
     super(); 
     this.mPlace = place; 
     this.mMetrics = dm; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     // For retaining the fragment on screen rotation 
     setRetainInstance(true); 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.dialog_layout, null); 

     // Getting reference to ViewFlipper 
     mFlipper = (ViewFlipper) v.findViewById(R.id.flipper); 

     // Getting reference to TextView to display photo count 
     mTVPhotosCount = (TextView) v.findViewById(R.id.tv_photos_count); 

     // Getting reference to TextView to display place vicinity 
     mTVVicinity = (TextView) v.findViewById(R.id.tv_vicinity); 

     if(mPlace!=null){ 

      // Setting the title for the Dialog Fragment 
      getDialog().setTitle(mPlace.mPlaceName); 

      // Array of references of the photos 
      Photo[] photos = mPlace.mPhotos; 

      // Setting Photos count 
      mTVPhotosCount.setText("Photos available : " + photos.length); 

      // Setting the vicinity of the place 
      mTVVicinity.setText(mPlace.mVicinity); 

      // Creating an array of ImageDownloadTask to download photos 
      ImageDownloadTask[] imageDownloadTask = new ImageDownloadTask[photos.length]; 

      int width = (int)(mMetrics.widthPixels*3)/4; 
      int height = (int)(mMetrics.heightPixels*1)/2; 

      String url = "https://maps.googleapis.com/maps/api/place/photo?"; 
      String key = "key=AIzaSyBSo1xlML-tOFTCdJb6qIbVnF9e7y5nj0o"; 
      String sensor = "sensor=true"; 
      String maxWidth="maxwidth=" + width; 
      String maxHeight = "maxheight=" + height; 
      url = url + "&" + key + "&" + sensor + "&" + maxWidth + "&" + maxHeight; 

      // Traversing through all the photoreferences 
      for(int i=0;i<photos.length;i++){ 
       // Creating a task to download i-th photo 
       imageDownloadTask[i] = new ImageDownloadTask(); 

       String photoReference = "photoreference="+photos[i].mPhotoReference; 

       // URL for downloading the photo from Google Services 
       url = url + "&" + photoReference; 

       // Downloading i-th photo from the above url 
       imageDownloadTask[i].execute(url); 
      } 
     } 
     return v; 
    } 

    @Override 
    public void onDestroyView() { 
     if (getDialog() != null && getRetainInstance()) 
      getDialog().setDismissMessage(null); 
      super.onDestroyView(); 
    } 

    private Bitmap downloadImage(String strUrl) throws IOException{ 
     Bitmap bitmap=null; 
     InputStream iStream = null; 
     try{ 
      URL url = new URL(strUrl); 

      /** Creating an http connection to communcate with url */ 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

      /** Connecting to url */ 
      urlConnection.connect(); 

      /** Reading data from url */ 
      iStream = urlConnection.getInputStream(); 

      /** Creating a bitmap from the stream returned from the url */ 
      bitmap = BitmapFactory.decodeStream(iStream); 

     }catch(Exception e){ 
      Log.d("Exception while downloading url", e.toString()); 
     }finally{ 
      iStream.close(); 
     } 
     return bitmap; 
    } 

    private class ImageDownloadTask extends AsyncTask<String, Integer, Bitmap>{ 
     Bitmap bitmap = null; 
     @Override 
     protected Bitmap doInBackground(String... url) { 
      try{ 
       // Starting image download 
       bitmap = downloadImage(url[0]); 
      }catch(Exception e){ 
       Log.d("Background Task",e.toString()); 
      } 
      return bitmap; 
     } 

     @Override 
     protected void onPostExecute(Bitmap result) { 
      // Creating an instance of ImageView to display the downloaded image 
      ImageView iView = new ImageView(getActivity().getBaseContext()); 

      // Setting the downloaded image in ImageView 
      iView.setImageBitmap(result); 

      // Adding the ImageView to ViewFlipper 
      mFlipper.addView(iView); 

      // Showing download completion message 
      Toast.makeText(getActivity().getBaseContext(), "Image downloaded successfully", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 
+0

Błąd jest wywoływanie w parametryzowanego konstruktora PlaceDialogFragment na linii super(); – Divyang

+0

Sprawdziłem niektóre odpowiedzi i dostałem, że jeśli usuniesz super() z konstruktora, to powinno działać dobrze ... – Vickyexpert

Odpowiedz

7

Ze względu na naturę fragmentu oraz sposób zarządzania i wyświetlania na ekranie zaleca się, aby nie tworzyć domyślnego konstruktora, aw wielu przypadkach powodowałoby to problemy w czasie wykonywania. W przypadku powinieneś zrobić coś takiego:

public static final GridFragment newInstance(String tabId) 
{ 
    GridFragment f = new GridFragment(); 
    Bundle bdl = new Bundle(2); 
    bdl.putString(TAB_ID, tabId); 
    f.setArguments(bdl); 
    return f; 
} 

aw onCreate wyodrębnić potrzebne dane z pakietu:

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    String tabId = getArguments().getString(TAB_ID); 
    } 

I spójrz na to pytanie, a także:

Do fragments really need an empty constructor?

23

Jeśli chcesz być poza regułami, wykonaj następujące czynności:

@SuppressLint("ValidFragment") 
public PlaceDialogFragment(Place place, DisplayMetrics dm){ 
     super(); 
     this.mPlace = place; 
     this.mMetrics = dm; 
    } 
+0

błąd: nie można znaleźć symbolu klasy SuppressLint –

3
@SuppressLint({"NewApi", "ValidFragment"}) 
public PlaceDialogFragment(Place place, DisplayMetrics dm){ 
     super(); 
     } 
+0

W przyszłości należy podać wyjaśnienie z odpowiedzią. – EternalHour

2

Łatwiej sposobem jest dodanie ich do Gradle:

android { 
     lintOptions { 
      checkReleaseBuilds false 
     } 
    } 

Albo można dodać ten wiersz w każdym fragmencie

@SuppressLint("ValidFragment") 
public PlaceDialogFragment(Place place, DisplayMetrics dm){ 
    super(); 
    this.mPlace = place; 
    this.mMetrics = dm; 
} 

Najlepszym rozwiązaniem jest dodanie linii w Gradle prostu.

0

rozwiązanie pracował dla mnie

android { 
      lintOptions { 
       checkReleaseBuilds false 
      } 
     } 
Powiązane problemy