我试图在片段中创建一个 ImageView,它将引用我在片段的 XML 中创建的 ImageView 元素。但是, findViewById
方法仅在我扩展 Activity 类时才有效。无论如何,我还可以在片段中使用它吗?
public class TestClass extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ImageView imageView = (ImageView)findViewById(R.id.my_image);
return inflater.inflate(R.layout.testclassfragment, container, false);
}
}
findViewById
方法有一个错误,表明该方法是未定义的。
使用getView()或 View 参数实现onViewCreated
方法。它返回片段的根视图(由onCreateView()
方法返回的视图) 。有了这个,你可以调用findViewById()
。
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
ImageView imageView = (ImageView) getView().findViewById(R.id.foo);
// or (ImageView) view.findViewById(R.id.foo);
由于getView()
仅在onCreateView()
之后工作, 因此不能在片段的onCreate()
或onCreateView()
方法中使用它 。
你需要给 Fragment 的视图充气并在它返回的View
上调用findViewById()
。
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
return view;
}
在Fragment
类中,您将获得onViewCreated()覆盖方法,您应始终初始化视图,因为在此方法中您可以使用视图对象来查找您的视图,如:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(R.id.yourId).setOnClickListener(this);
// or
getActivity().findViewById(R.id.yourId).setOnClickListener(this);
}
永远记住在片段的情况下onViewCreated()
方法不会叫,如果自动您返回 null 或super.onCreateView()
从onCreateView()
方法。默认情况下, ListFragment
将默认调用它,因为ListFragment
默认返回FrameLayout
。
注意:一旦onCreateView()
成功执行,就可以使用getView()
获取类中任何位置的片段视图。即
getView().findViewById("your view id");