1

首先让我这样说:我已经查看了有关此问题的所有其他线程并梳理了谷歌的答案,但没有任何帮助。

我有一个包含在运行时添加的自定义视图的布局。我的自定义视图有super(context, attrs)构造函数。

自定义视图:

public CustomLinearLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    initialize some variables...
}

我使用以下方法将视图添加到我的活动中:

public void addNewView (boolean isEmpty) {
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    for (int i = 0; i < amount; i++) {
    if (isEmpty) {
        View v = (ViewGroup) inflater.inflate(R.layout.my_custom_layout, layoutContainer, true);
        viewTracker++;
    }
    }
}

如果我在上述方法中将 findViewById 用于我的自定义视图,addNewView()那么一切都很好。但是,如果我在视图膨胀后(显然是在 之后)尝试在活动中的其他任何地方使用 findViewById,setContentView我会得到一个空指针。我也试过someView.findViewById()哪个不起作用。我难住了。有任何想法吗?

Logcat 显示一个空指针,但仅此而已:

02-16 06:56:10.681: E/AndroidRuntime(11360): FATAL EXCEPTION: main
02-16 06:56:10.681: E/AndroidRuntime(11360): java.lang.NullPointerException
02-16 06:56:10.681: E/AndroidRuntime(11360): at com.nutrifit.Fragments.WorkoutPlannerPopup.resetOtherView(WorkoutPlannerPopup.java:404)
02-16 06:56:10.681: E/AndroidRuntime(11360): at com.nutrifit.customviews.CustomLinearLayout.onTouchEvent(CustomLinearLayout.java:43)
02-16 06:56:10.681: E/AndroidRuntime(11360): at android.view.View.dispatchTouchEvent(View.java:7239)
02-16 06:56:10.681: E/AndroidRuntime(11360): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2168)
02-16 06:56:10.681: E/AndroidRuntime(11360): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1903)
02-16 06:56:10.681: E/AndroidRuntime(11360): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)

这是我在 XML 中的自定义视图:

<?xml version="1.0" encoding="utf-8"?>
<com.nutrifit.customviews.CustomLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/exercise_container_0"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@drawable/wpp_background_border" >

<ImageView android:id="@+id/delete_button_1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/wpp_background_border" />
...more android child views

</com.nutrifit.customviews.CustomLinearLayout>
4

1 回答 1

3

方法在哪里addNewView()被调用?据我了解,如果您findViewById()在自定义视图的构造函数中执行 a ,您可以获得null. 我还没有找到一个权威参考来说明何时可以安全地调用findViewById()自定义视图,但我通常会在此期间onFinishInflate()或之后进行。

于 2013-02-27T12:36:46.537 回答