0

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

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

  • 我的 BallHoldView 需要一个带有传递给它的属性的构造函数。(查看)
  • 我的 scoreText 需要参考活动进行实例化,而不是视图: ((Activity)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 为空:

scoreText = (TextView)((Activity)getContext()).findViewById(R.id.scoreText);
            Log.e("BallHoldView", "scoreText created");
    if(scoreText != null)
    {
        scoreText.setText("New Score");
            Log.e("BallHoldView", "scoreText changed");
    }
    else
        Log.e("BallHoldView", "scoreText was null");

为什么它是空的?

4

1 回答 1

0

问题是您在第 37 行的代码

scoreText.setText("New Score");

scoreTextnull

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

上面的行是找不到的scoreText。这可能是因为当自定义视图布局膨胀时,它将调用其构造函数,并且在那里您试图引用scoreText尚未膨胀的,因为它ballHold在您的 android xml 之后出现。
解决方案可能是将ballHold自定义视图放在您scoreText的 android xml 之后。否则,正确的方法是将scoreTextTextView 从您的 java 活动代码传递到BallHoldView其构造函数中的 CustomView 类,然后使用它。在这种情况下,在您的活动代码中,您肯定能够通过 id 找到视图。

于 2014-10-05T05:23:11.607 回答