1

진단 할 수없는 이상한 NPE가 나타납니다. ProgressBar 스피너를 참조 할 때 발생한다는 것을 알고 있지만, 왜 그 부분을 onCreateView에서 인스턴스화하는지 알 수는 없습니다.onActivityCreated의 유니버설 이미지 로더 조각의 진행 막대에 대한 NullPointerException

다음은 내 조각을위한 코드입니다. 보시려면 유니버설 이미지 로더를 사용하여 이미지를로드하고 있습니다. 이미지가로드됩니다. 스피너 E.G에 대한 코드 줄을 완전히 제거하면됩니다. spinner.setVisibility (View.GONE); spinner.setVisibility (View.VISIBLE);

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.ProgressBar; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.nostra13.universalimageloader.core.DisplayImageOptions; 
import com.nostra13.universalimageloader.core.ImageLoader; 
import com.nostra13.universalimageloader.core.assist.FailReason; 
import com.nostra13.universalimageloader.core.assist.ImageScaleType; 
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; 
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; 


/** 
* A simple {@link Fragment} subclass. 
* Activities that contain this fragment must implement the 
* 
* to handle interaction events. 
* Use the {@link ImageFragment#newInstance} factory method to 
* create an instance of this fragment. 
* 
*/ 
public class ImageFragment extends Fragment { 
    // TODO: Rename parameter arguments, choose names that match 
    private static final String ARG_PARAM1 = "param1"; 
    private static final String ARG_PARAM2 = "param2"; 

    private int mImageNum; 

    private ImageView imageDisplay; 
    private TextView textTest; 

    public ProgressBar spinner; 

    private String mUrl; 

    private ImageLoader imageLoader = ImageLoader.getInstance(); 

    DisplayImageOptions options; 


    /** 
    * Use this factory method to create a new instance of 
    * this fragment using the provided parameters. 
    * 
    * @return A new instance of fragment ImageFragment. 
    */ 
    // TODO: Rename and change types and number of parameters 
    public static ImageFragment newInstance(int position, String url) 
    { 
     ImageFragment fragment = new ImageFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_PARAM1, position); 
     args.putString(ARG_PARAM2, url); 
     fragment.setArguments(args); 
     return fragment; 
    } 
    public ImageFragment() 
    { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mImageNum = getArguments() != null ? getArguments().getInt(ARG_PARAM1) : -1; 
     mUrl = getArguments() != null ? getArguments().getString(ARG_PARAM2) : null; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     final View v = inflater.inflate(R.layout.fragment_image, container, false); 
     imageDisplay = (ImageView) v.findViewById(R.id.imageView); 
     spinner = (ProgressBar) imageDisplay.findViewById(R.id.loading); 

     options = new DisplayImageOptions.Builder() 
       .showImageForEmptyUri(R.drawable.ic_empty) 
       .showImageOnFail(R.drawable.ic_error) 
       .resetViewBeforeLoading(true) 
       .cacheOnDisk(true) 
       .imageScaleType(ImageScaleType.EXACTLY) 
       .bitmapConfig(Bitmap.Config.RGB_565) 
       .considerExifParams(true) 
       .displayer(new FadeInBitmapDisplayer(300)) 
       .build(); 

     return v; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 



     imageLoader.displayImage(mUrl, imageDisplay, options, new SimpleImageLoadingListener() { 
      @Override 
      public void onLoadingStarted(String imageUri, View view) { 
       spinner.setVisibility(View.VISIBLE); 
      } 

      @Override 
      public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
       String message = null; 
       switch (failReason.getType()) { 
        case IO_ERROR: 
         message = "Input/Output error"; 
         break; 
        case DECODING_ERROR: 
         message = "Image can't be decoded"; 
         break; 
        case NETWORK_DENIED: 
         message = "Downloads are denied"; 
         break; 
        case OUT_OF_MEMORY: 
         message = "Out Of Memory error"; 
         break; 
        case UNKNOWN: 
         message = "Unknown error"; 
         break; 
       } 

       spinner.setVisibility(View.GONE); 
      } 

      @Override 
      public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
       spinner.setVisibility(View.GONE); 
      } 
     }); 




    } 
} 

도와주세요! 이

답변

1
final View v = inflater.inflate(R.layout.fragment_image, container, false); 
imageDisplay = (ImageView) v.findViewById(R.id.imageView); 
spinner = (ProgressBar) imageDisplay.findViewById(R.id.loading); 

가이 "회"당신의 조각보기 또는 "imageDisplay"의 아이를 작동하지 않는 이유는 조각 좋은 아니에요, 난 알아낼 수 없습니다?

아마도, 그것은 spinner = (ProgressBar) v.findViewById(R.id.loading);

2

당신은 당신은 Fragment에 부풀려에서 View을 찾아야한다

spinner = (ProgressBar) v.findViewById(R.id.loading); 

으로이

spinner = (ProgressBar) imageDisplay.findViewById(R.id.loading); 

을 변경해야해야한다.

+0

아래의 녀석이 먼저 대답했지만, 내 책에서 두 사람 모두 우승자입니다! – slackbot39243

+1

@ user2977650 ohhh 그때 나는 당신이 새로운 친구라고 생각한다. 나는 희망한다! –