我无法找到此行抛出NullPointerException异常的原因:
ImageView imageView1 = (ImageView) rootView.findViewById(R.id.imageView1);
这一切都发生在一个片段中 这是片段:
public static class MyFragment extends Fragment {
private View rootView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_layout,
container, false);
return rootView;
}
public void setImage(Uri imageUri) {
ImageView imageView1 = (ImageView) rootView.findViewById(R.id.imageView1);
imageView1.setImageURI(imageUri);
}
}
这是片段布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</ScrollView>
</RelativeLayout>
方法setImage()从片段外部调用。
答案 0 :(得分:1)
因此,您的rootView
似乎是null
;
您确定要在已调用setImage()
的片段实例上调用onCreateView
吗?您可以通过向两个方法添加println
并检查控制台/ LogCat的顺序来测试这一点。
您可以将代码发布到setImage()
。
如果确实存在,那就是问题,有几个解决方案,有些比其他解决方案更好。对于初学者,您可以尝试将rootView
或imageView1
传递到您致电setImage()
的活动,并将setImage()
移至该活动。不是最佳做法,但试试看它是否有效。
(会有评论,但我没有足够的声誉。回复评论,我会根据你的评论编辑答案。)
答案 1 :(得分:0)
这是因为这条线而发生的
private View rootView;
声明rootView
但未将其设置为等于任何内容,因此默认情况下它的值为NULL或rootView == NULL
为真。虽然您在onCreateView()
中进行了设置,但如果永远不会调用onCreateView()
会发生什么? rootView
仍然为NULL,即使setImage()
依赖于它被设置为某种东西,这将导致NULLPounterException
。没有要求在onCreateView()
之前调用setImage()
或者甚至调用,这意味着rootView可能仍然为null,因此没有调用.findViewById()
方法。虽然技术上确实首先调用onCreateView()
,但Java编译器并不知道这一点。这与Android本身的工作方式有关,而与实际的Java语言无关。实际上onCreateView()
确实在您有机会运行setImage()
之前运行,但是编译器仍然会抱怨。如果您只使用if语句包装函数以确保rootView在执行任何操作之前永远不为NULL,则应该修复此问题。
改变这个:
public void setImage(Uri imageUri) {
ImageView imageView1 = (ImageView) rootView.findViewById(R.id.imageView1);
imageView1.setImageURI(imageUri);
}
}
对此:
public void setImage(Uri imageUri) {
//Will only run if rootView isn't NULL so you won't be able to get a NULLPointer
if(rootView != NULL){
ImageView imageView1 = (ImageView) rootView.findViewById(R.id.imageView1);
imageView1.setImageURI(imageUri);
}
}
}