2014-10-05 93 views
0

动态的setText我有一个自定义视图“BallHoldView的”从活动“BallHoldActivity”跑通过将所述以合并标签内的BallHoldActivity布局资源。也在同一个布局xml中是一个TextView(scoreText)。我想从BallHoldView中动态设置scoreText的文本。 当我的程序尝试运行scoreText.setText(“new text here”);我得到一个view.InflateException。注释掉这一行代码可以消除错误。android.view.InflateException与自定义视图

通过在线研究,我已经确定了以下内容:

  • 我BallHoldView需要与传递给它的属性的构造函数。 (检查)
  • 我scoreText需要参考被实例化到活动中,不是视图:((活动)的getContext())findViewById(R.id.scoreText); (支票)
  • 看来这个异常的大部分问题是某些东西在xml文件中没有正确声明。我认为问题在于我错过了xml文件中的某些内容,但我不知道该怎么办,而且我也找不到在线解决方案。

有人能看到什么,我缺少的,或者我做了什么错?

主要误差似乎是:

android.view.InflateException: Binary XML file line #12: Error inflating class 
Caused by: java.lang.reflect.InvocationTargetException 
Caused by: java.lang.NullPointerException 

XML线#12(&#13):

<oaa.tms.zoneball.ballHold.BallHoldView 
android:id="@+id/ballHold" 

空指针是在BallHoldView.java:37是:

scoreText.setText("New Score"); // java line 37. 

这里的BallHoldView:

public class BallHoldView extends View 
{ 
private ShapeDrawable circle10, circle50, circleEYE; 
private TextView scoreText; 
private int viewWidth, viewHeight; 
private float circCentreX, circCentreY, circ10Radius, circ50Radius, circEyeRadius; 

public BallHoldView(Context context) 
{ 
    super(context); 
} 

public BallHoldView(Context context, AttributeSet attrs) 
{ super(context, attrs); 
Log.e("BallHoldView", "CONSTRUCTOR ENTERED"); 
circle10 = new ShapeDrawable(new OvalShape()); 
    circle10.getPaint().setColor(0xffff9900); 
circle50 = new ShapeDrawable(new OvalShape()); 
    circle50.getPaint().setColor(0xffb80000); 
circleEYE = new ShapeDrawable(new OvalShape()); 
    circleEYE.getPaint().setColor(0xff000000); 
scoreText = (TextView)((Activity)getContext()).findViewById(R.id.scoreText); 
      Log.e("BallHoldView", "scoreText created"); 
    scoreText.setText("New Score"); 
      Log.e("BallHoldView", "scoreText changed"); 
} 

public void onDraw(Canvas c) 
{ 
    super.onDraw(c); 
    // Draw some circles here 
} 

protected void onSizeChanged(int w, int h, int oldW, int oldH) 
{ 
    // change circle parameters here 
} 
} 

这里的XML:

<merge xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@drawable/shape_rect_black_border" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="oaa.tms.zoneball.BallHoldActivity" > 

<oaa.tms.zoneball.ballHold.BallHoldView 
android:id="@+id/ballHold" 
android:layout_width="match_parent" 
android:layout_height="match_parent" /> 

<TextView 
android:id="@+id/scoreText" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_gravity="top|left" 
android:background="@drawable/shape_rect_textbg" 
android:textSize="22sp" 
android:text="@string/score" /> 

<TextView 
android:id="@+id/timeText" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_gravity="top|right" 
android:background="@drawable/shape_rect_textbg" 
android:textSize="22sp" 
android:text="@string/time" /> 

</merge> 

这里的日志猫(错误):

10-05 17:44:04.326: E/BallHoldView(3474): CONSTRUCTOR ENTERED 
10-05 17:44:04.326: E/BallHoldView(3474): scoreText created 
10-05 17:44:04.336: E/AndroidRuntime(3474): FATAL EXCEPTION: main 
10-05 17:44:04.336: E/AndroidRuntime(3474): java.lang.RuntimeException: Unable to start activity ComponentInfo{oaa.tms.zoneball/oaa.tms.zoneball.BallHoldActivity}: android.view.InflateException: Binary XML file line #12: Error inflating class oaa.tms.zoneball.ballHold.BallHoldView 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2249) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2299) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.app.ActivityThread.access$700(ActivityThread.java:154) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.os.Looper.loop(Looper.java:137) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.app.ActivityThread.main(ActivityThread.java:5306) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at java.lang.reflect.Method.invoke(Method.java:511) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at dalvik.system.NativeStart.main(Native Method) 
10-05 17:44:04.336: E/AndroidRuntime(3474): Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class oaa.tms.zoneball.ballHold.BallHoldView 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.view.LayoutInflater.createView(LayoutInflater.java:619) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:693) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:752) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.view.LayoutInflater.inflate(LayoutInflater.java:460) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:342) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.app.Activity.setContentView(Activity.java:1928) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.support.v7.app.ActionBarActivity.superSetContentView(ActionBarActivity.java:217) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.support.v7.app.ActionBarActivityDelegateICS.setContentView(ActionBarActivityDelegateICS.java:110) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:77) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at oaa.tms.zoneball.BallHoldActivity.onCreate(BallHoldActivity.java:17) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.app.Activity.performCreate(Activity.java:5255) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2213) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  ... 11 more 
10-05 17:44:04.336: E/AndroidRuntime(3474): Caused by: java.lang.reflect.InvocationTargetException 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at java.lang.reflect.Constructor.constructNative(Native Method) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at android.view.LayoutInflater.createView(LayoutInflater.java:593) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  ... 25 more 
10-05 17:44:04.336: E/AndroidRuntime(3474): Caused by: java.lang.NullPointerException 
10-05 17:44:04.336: E/AndroidRuntime(3474):  at oaa.tms.zoneball.ballHold.BallHoldView.<init>(BallHoldView.java:37) 
10-05 17:44:04.336: E/AndroidRuntime(3474):  ... 28 more 

编辑: 使用下面的代码我已确认scoreText为空:

​​

为什么它是空的?

回答

0

的问题是,你的代码在行#37

scoreText.setText("New Score"); 

scoreTextnull

scoreText = (TextView)((Activity)getContext()).findViewById(R.id.scoreText); 

上述行无法找到scoreText。这可能是因为当自定义视图布局充气时,它会调用它的构造,并在那里你想指scoreText尚未充气的是,当它在你的Android XML来ballHold后。
的解决方案可能是把ballHold自定义视图您scoreText后的Android XML。否则,正确的方法是将scoreText TextView从Java活动代码传递到BallHoldView CustomView类的构造函数中,然后使用它。在这种情况下,在您的活动代码中,您一定能够通过id查找查看。

+0

snap!你很快:-) 谢谢,我会尝试两种方式。 (一次一个!) – sezmeralda 2014-10-05 05:26:08

+0

我还没有能够得到任何方法的工作。看起来,人们将TextView组件从活动xml传递到自定义视图存在很大的麻烦。我想我必须从活动代码中删除scoreText,并将其纯粹保留在自定义视图代码中。 – sezmeralda 2014-10-06 07:11:04

+0

从xml中删除'scoreText'并从定制视图中以编程方式创建它。 – sezmeralda 2014-10-10 19:27:13