android.view.InflateException与自定义视图
问题描述:
动态的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为空:
为什么它是空的?
答
的问题是,你的代码在行#37
scoreText.setText("New Score");
scoreText
是null
。
scoreText = (TextView)((Activity)getContext()).findViewById(R.id.scoreText);
上述行无法找到scoreText
。这可能是因为当自定义视图布局充气时,它会调用它的构造,并在那里你想指scoreText
尚未充气的是,当它在你的Android XML来ballHold
后。
的解决方案可能是把ballHold
自定义视图您scoreText
后的Android XML。否则,正确的方法是将scoreText
TextView从Java活动代码传递到BallHoldView
CustomView类的构造函数中,然后使用它。在这种情况下,在您的活动代码中,您一定能够通过id查找查看。
snap!你很快:-) 谢谢,我会尝试两种方式。 (一次一个!) – sezmeralda 2014-10-05 05:26:08
我还没有能够得到任何方法的工作。看起来,人们将TextView组件从活动xml传递到自定义视图存在很大的麻烦。我想我必须从活动代码中删除scoreText,并将其纯粹保留在自定义视图代码中。 – sezmeralda 2014-10-06 07:11:04
从xml中删除'scoreText'并从定制视图中以编程方式创建它。 – sezmeralda 2014-10-10 19:27:13