我的应用程序中有一个Fragment,它使用了ProgressBar,即圆圈。 我的片段是:
@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");
}
我已尝试在onActivityCreated和onCreateView中使用progressBar.setProgress(50);
。但我仍然得到一个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)
当我尝试在TextView上设置文本时,它正在工作。为什么设置进度不起作用?
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"/>
我也有类:CircleProgressBar.java
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();
}
}
非常感谢任何帮助!
答案 0 :(得分:1)
根据您的布局,您的进度元素标识为custom_progressBar
而不是progressBar
。
尝试改变这一点:
ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.progressBar);
为此:
ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.custom_progressBar);