添加自定义视图作为XML布局
的视图的场景如下:添加自定义视图作为XML布局
我有一个活动RunTrainingWorkoutsView使用XML布局_run_workout.xml_一些标签由CountDownTimer更新。正常工作......
现在,除了由onTick()CountDownTimer对象回调方法每秒更新标签,我想自定义视图表面添加到我的_run_workout.xml layout_会得出更新了一些弧线由同一onTick()方法每一秒......
我run_workout.xml:
<training.timer.CounterClockView
android:id="@+id/counter_clock_surface"
android:layout_width="300dp"
android:layout_height="240dp">
</training.timer.CounterClockView>
我的自定义视图扩展
//counterClockView is declared outside of onCreate() as CounterClockView counterClockView;
//later in onCreate(){....
counterClockView = (CounterClockView) findViewById(R.id.counter_clock_surface);
问题是改变成员变量的值:surfaceView
public class CounterClockView extends SurfaceView {
Paint paint = new Paint();
Paint paint2 = new Paint();
final RectF rect = new RectF();
final RectF rect2 = new RectF();
int counterArcAngle = 15;
//constructor
public CounterClockView(Context context, AttributeSet attributeSet) {
super(context);
//setting some paint properties...
this.setBackgroundColor(Color.TRANSPARENT);
}
@Override
public void onDraw(Canvas canvas) {
rect.set(50, 50, 150, 150);
rect2.set(50, 50, 150, 150);
this.layout(0, 0, 200, 200);
canvas.drawArc(rect, -90, 360, false, paint);
canvas.drawArc(rect2, -90, counterArcAngle, false, paint2);
}
我的主要延伸活性用下面的代码获取参考到自定义surfaceView在布局类的customView对象(counterClockView)
counterClockView.counterArcAngle = 10;
会崩溃应用程序...
而且,从我的主要活动,我想打电话给无效()方法改变counterArcAngle值后重做表面看来,但这会导致应用程序崩溃太...
为什么不能创建counterClockView对象并将其引用到相同类型的xml布局元素,并更改其appetion,使其无效等。
编辑logcat的:
threadid=1: thread exiting with uncaught exception (group=0x40015560)
ERROR/AndroidRuntime(487): FATAL EXCEPTION: main
ERROR/AndroidRuntime(487): java.lang.RuntimeException: Unable to start activity ComponentInfo{training.timer/training.timer.RunTrainingWorkoutsView}: java.lang.NullPointerException
ERROR/AndroidRuntime(487): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
ERROR/AndroidRuntime(487): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
ERROR/AndroidRuntime(487): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
ERROR/AndroidRuntime(487): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
ERROR/AndroidRuntime(487): at android.os.Handler.dispatchMessage(Handler.java:99)
ERROR/AndroidRuntime(487): at android.os.Looper.loop(Looper.java:123)
ERROR/AndroidRuntime(487): at android.app.ActivityThread.main(ActivityThread.java:3683)
ERROR/AndroidRuntime(487): at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/AndroidRuntime(487): at java.lang.reflect.Method.invoke(Method.java:507)
ERROR/AndroidRuntime(487): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
ERROR/AndroidRuntime(487): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
ERROR/AndroidRuntime(487): at dalvik.system.NativeStart.main(Native Method)
ERROR/AndroidRuntime(487): Caused by: java.lang.NullPointerException
ERROR/AndroidRuntime(487): at training.timer.RunTrainingWorkoutsView.onCreate(RunTrainingWorkoutsView.java:72)
ERROR/AndroidRuntime(487): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
ERROR/AndroidRuntime(487): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
ERROR/AndroidRuntime(487): ... 11 more
后我敲我的头撞在墙上了3天,并通过谷歌搜索得到它,stacOverflowing等
其实,这是这个愚蠢的小东西.. 。
我的XML文件,我定义了包含一些常见的Android视图(textView和按钮即布局)和我的自定义视图CounterClockView我有:
<training.timer.CounterClockView
android:id="@+id/counter_clock_surface"
android:layout_width="300dp"
android:layout_height="240dp">
,我不得不增加了一个线!
<training.timer.CounterClockView
xmlns:android="http://schemas.android.com/apk/res/android" !!!
android:id="@+id/counter_clock_surface"
android:layout_width="300dp"
android:layout_height="240dp">
</training.timer.CounterClockView>
我不知道为什么这个命名空间行做了如此巨大的差异,但它很好用!
现在,我可以从我的主要活动更新每个onTick()CountDownTimer的()我的自定义视图...
以下的答案是非常有益的: findViewById() returns null for custom component in layout XML, not for other components
当初同样的问题,所以我只是在我的自定义视图的Java类中实现了所有三个构造函数,所有这三个构造函数都加上了onDrow方法,并且它像一个魅力一样工作。尝试一下。
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;
public class CustomWorldWideView extends View {
public CustomWorldWideView(Context context) {
super(context);
}
public CustomWorldWideView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomWorldWideView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//Some simple draw on the view...
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.parseColor("#FFA800"));
Path path = new Path();
path.moveTo(0, 0);
path.lineTo(getWidth()/2, 0);
path.lineTo(getWidth(), getHeight()/2);
path.lineTo(getWidth()/2, getHeight());
path.lineTo(0, getHeight());
path.lineTo(0, 0);
canvas.drawPath(path, paint);
}
}
的XML:
<PackageName.CustomWorldWideView
android:layout_width="56.00dp"
android:layout_height="43dp"
android:id="@+id/world_wide_grid_view_2"
/>
有什么错误日志?从'LogCat'读取输出 –
我添加了日志。谢谢... – luigi7up
'RunTrainingWorkoutsView.onCreate()'在这个方法中,第72行在这个文件中'RunTrainingWorkoutsView.java',一个对象是'NULL'。一探究竟! –