分段中的非默认构造函数出错

我正在处理地图apiv2。 而且在编写Dialog Fragment类时出现以下错误。

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

这是代码:

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

任何帮助,不胜感激..

修订:这是整个代码…我是一个新手,从来没有处理过碎片..我正在通过地图tut,发现这个..你可以详细阐述现在你正试图解释..

 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(); } } } 

Solutions Collecting From Web of "分段中的非默认构造函数出错"

如果你喜欢跳出规则,那就下一步

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

由于片段的性质以及如何在屏幕上进行pipe理和显示,因此build议不要创build非默认构造函数,并且在很多情况下这会在运行时造成问题。 如果你应该这样做:

 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; } 

并在onCreate从捆绑提取所需的数据:

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

再看看这个问题:

碎片真的需要一个空的构造函数吗?

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

更简单的方法是将这些添加到gradle中:

 android { lintOptions { checkReleaseBuilds false } } 

或者你可以在每个片段中添加这一行

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

最好的解决scheme是简单地在gradle中添加行。

解决scheme为我工作

 android { lintOptions { checkReleaseBuilds false } }