协慌网

登录 贡献 社区

片段中的 findViewById

我试图在片段中创建一个 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");