2011-11-02 102 views
1

的视图的场景如下:添加自定义视图作为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 
+1

有什么错误日志?从'LogCat'读取输出 –

+0

我添加了日志。谢谢... – luigi7up

+0

'RunTrainingWorkoutsView.onCreate()'在这个方法中,第72行在这个文件中'RunTrainingWorkoutsView.java',一个对象是'NULL'。一探究竟! –

回答

6

后我敲我的头撞在墙上了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

2

当初同样的问题,所以我只是在我的自定义视图的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" 
      />