2016-04-05 7 views
-2

Ich habe ein Fragment in meiner App, die ProgressBar, den ersten Kreis verwendet. Mein Fragment ist:NullPointerException versucht setProgress (int)

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_home, 
      container, false); 
    getActivity().setTitle(R.string.title_home); 
    ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.progressBar); 
    progressBar.setProgress(100); 
    return view; 
} 

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


    TextView text = (TextView) getView().findViewById(R.id.textView); 
    text.setText("TEST"); 
} 

Ich habe versucht, mit progressBar.setProgress(50); sowohl in onActivityCreated und onCreateView. Aber ich bekomme immer noch eine NullPointerException.

Logcat:

FATAL EXCEPTION: main 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{stin1.ngt.nextgentelruter/stin1.ngt.nextgentelruter.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ProgressBar.setProgress(int)' on a null object reference 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
    at android.app.ActivityThread.access$800(ActivityThread.java:151) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5254) 
    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:903) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ProgressBar.setProgress(int)' on a null object reference 
    at stin1.ngt.nextgentelruter.HomeFragment.onCreateView(HomeFragment.java:56) 
    at android.app.Fragment.performCreateView(Fragment.java:2053) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
    at android.app.BackStackRecord.run(BackStackRecord.java:834) 
    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452) 
    at android.app.Activity.performStart(Activity.java:6005) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2288) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)  
    at android.app.ActivityThread.access$800(ActivityThread.java:151)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:135)  
    at android.app.ActivityThread.main(ActivityThread.java:5254)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at java.lang.reflect.Method.invoke(Method.java:372) 

Wenn ich versuche, auf einem Textview setText es funktioniert. Warum funktioniert der Fortschritt nicht?

XML:

<stin1.ngt.nextgentelruter.CircleProgressBar 
      android:id="@+id/custom_progressBar" 
      android:layout_width="150dp" 
      android:layout_height="150dp" 
      android:layout_margin="10dp" 
      app:progress="35" 
      app:progressBarThickness="4dp"/> 

ich die Klasse auch haben: CircleProgressBar.java ist

public class CircleProgressBar extends View { 


    /** 
    * ProgressBar's line thickness 
    */ 
    private float strokeWidth = 4; 
    private float progress = 0; 
    private int min = 0; 
    private int max = 100; 
    /** 
    * Start the progress at 12 o'clock 
    */ 
    private int startAngle = -90; 
    private int color = Color.DKGRAY; 
    private RectF rectF; 
    private Paint backgroundPaint; 
    private Paint foregroundPaint; 

    public float getStrokeWidth() { 
     return strokeWidth; 
    } 

    public void setStrokeWidth(float strokeWidth) { 
     this.strokeWidth = strokeWidth; 
     backgroundPaint.setStrokeWidth(strokeWidth); 
     foregroundPaint.setStrokeWidth(strokeWidth); 
     invalidate(); 
     requestLayout();//Because it should recalculate its bounds 
    } 

    public float getProgress() { 
     return progress; 
    } 

    public void setProgress(float progress) { 
     this.progress = progress; 
     invalidate(); 
    } 

    public int getMin() { 
     return min; 
    } 

    public void setMin(int min) { 
     this.min = min; 
     invalidate(); 
    } 

    public int getMax() { 
     return max; 
    } 

    public void setMax(int max) { 
     this.max = max; 
     invalidate(); 
    } 

    public int getColor() { 
     return color; 
    } 

    public void setColor(int color) { 
     this.color = color; 
     backgroundPaint.setColor(adjustAlpha(color, 0.3f)); 
     foregroundPaint.setColor(color); 
     invalidate(); 
     requestLayout(); 
    } 

    public CircleProgressBar(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context, attrs); 
    } 

    private void init(Context context, AttributeSet attrs) { 
     rectF = new RectF(); 
     TypedArray typedArray = context.getTheme().obtainStyledAttributes(
       attrs, 
       R.styleable.CircleProgressBar, 
       0, 0); 
     //Reading values from the XML layout 
     try { 
      strokeWidth = typedArray.getDimension(R.styleable.CircleProgressBar_progressBarThickness, strokeWidth); 
      progress = typedArray.getFloat(R.styleable.CircleProgressBar_progress, progress); 
      color = typedArray.getInt(R.styleable.CircleProgressBar_progressbarColor, color); 
      min = typedArray.getInt(R.styleable.CircleProgressBar_min, min); 
      max = typedArray.getInt(R.styleable.CircleProgressBar_max, max); 
     } finally { 
      typedArray.recycle(); 
     } 

     backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     backgroundPaint.setColor(adjustAlpha(color, 0.3f)); 
     backgroundPaint.setStyle(Paint.Style.STROKE); 
     backgroundPaint.setStrokeWidth(strokeWidth); 

     foregroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     foregroundPaint.setColor(color); 
     foregroundPaint.setStyle(Paint.Style.STROKE); 
     foregroundPaint.setStrokeWidth(strokeWidth); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     canvas.drawOval(rectF, backgroundPaint); 
     float angle = 360 * progress/max; 
     canvas.drawArc(rectF, startAngle, angle, false, foregroundPaint); 

    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 

     final int height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec); 
     final int width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec); 
     final int min = Math.min(width, height); 
     setMeasuredDimension(min, min); 
     rectF.set(0 + strokeWidth/2, 0 + strokeWidth/2, min - strokeWidth/2, min - strokeWidth/2); 
    } 

    /** 
    * Lighten the given color by the factor 
    * 
    * @param color The color to lighten 
    * @param factor 0 to 4 
    * @return A brighter color 
    */ 
    public int lightenColor(int color, float factor) { 
     float r = Color.red(color) * factor; 
     float g = Color.green(color) * factor; 
     float b = Color.blue(color) * factor; 
     int ir = Math.min(255, (int) r); 
     int ig = Math.min(255, (int) g); 
     int ib = Math.min(255, (int) b); 
     int ia = Color.alpha(color); 
     return (Color.argb(ia, ir, ig, ib)); 
    } 

    /** 
    * Transparent the given color by the factor 
    * The more the factor closer to zero the more the color gets transparent 
    * 
    * @param color The color to transparent 
    * @param factor 1.0f to 0.0f 
    * @return int - A transplanted color 
    */ 
    public int adjustAlpha(int color, float factor) { 
     int alpha = Math.round(Color.alpha(color) * factor); 
     int red = Color.red(color); 
     int green = Color.green(color); 
     int blue = Color.blue(color); 
     return Color.argb(alpha, red, green, blue); 
    } 

    /** 
    * Set the progress with an animation. 
    * Note that the {@link android.animation.ObjectAnimator} Class automatically set the progress 
    * so don't call the {@link CircleProgressBar#setProgress(float)} directly within this method. 
    * 
    * @param progress The progress it should animate to it. 
    */ 
    public void setProgressWithAnimation(float progress) { 

     ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(this, "progress", progress); 
     objectAnimator.setDuration(1500); 
     objectAnimator.setInterpolator(new DecelerateInterpolator()); 
     objectAnimator.start(); 
    } 
} 

Jede Hilfe sehr geschätzt!

Antwort

1

Entsprechend Ihrem Layout wird Ihr Fortschrittselement als custom_progressBar nicht progressBar identifiziert.

Versuchen, dies zu ändern:

ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.progressBar); 

Dazu:

ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.custom_progressBar); 
+0

Nur es herausgefunden. Mein Schlechter, ich brauche etwas Schlaf. Vielen Dank! –

+0

Wenn es korrekt ist, bitte akzeptieren Sie meine Antwort :) –

+0

Benötigt, um 10 Minuten zu warten :) –