在Fragment中使用findViewById

时间:2015-01-20 18:43:50

标签: android android-fragments

我正在创建一个新的Tab界面,对于每个标签我都有以下功能:

public class ClassViewFragment extends Fragment {
    ListView classListView = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.class_view, container, false);

        classListView = (ListView) findViewById(R.id.classList);

        return rootView;
    }
}

但我也在另一个地方cannot resolve method findViewById获得了runOnUiThread并且Error:(88, 29) error: cannot find symbol method runOnUiThread(<anonymous Runnable>)

我知道如果我的课程从Activity扩展而且这是一个标签片段,那么这些方法会正常工作,那么我该如何使用这个功能呢?

7 个答案:

答案 0 :(得分:6)

你需要

classListView = (ListView) rootView.findViewById(R.id.classList);

因为那是您关注的视图

要获得runOnUiThred,您需要执行getActivity().runOnUiThread

答案 1 :(得分:6)

您需要使用视图

引用findViewById
public class ClassViewFragment extends Fragment {
    ListView classListView = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.class_view, container, false);

        classListView = (ListView) rootView .findViewById(R.id.classList);

        return rootView;
    }
}

对于runOnUiThread,可能是Modifying an Android view from a different thread

的副本

使用它的喜欢,

activity.runOnUiThread(new Runnable());

答案 2 :(得分:2)

以下是findViewById方法的海岸解释;

findViewById()方法将与您的主布局绑定的相关对象一起使用。例如,在活动中,当您进行

setContentView(activity_main);

您暗示您的Activity将从activity_main检索其布局。因此,当您在活动中制作findViewById()时,实际上意味着this.findViewById(),其中this是您的Activity

因此,在您的情况下,布局class_view绑定到rootView。但是当你写findViewById时,就意味着this.findViewByIdthis是您所在的范围,在您的情况下是Fragment。但是,我不认为Fragment具有这种能力。因此,您应该参考rootView来检索您的观点。

rootView.findViewById()

答案 3 :(得分:1)

片段没有像Activity这样的findViewById()方法,所以你必须调用片段根视图的方法。尝试改为使用rootView.findViewById(R.id.classList)。

答案 4 :(得分:0)

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v =  inflater.inflate(R.layout.fragment_content_mediaplayer, container, false);
        mSeekbar = (SeekBar) v.findViewById(R.id.seekBarMusic);
        return v;

答案 5 :(得分:0)

使用rootView.findViewById(R.id.classList)代替findViewById(R.id.classList)

试试这个:

public class ClassViewFragment extends Fragment {
    ListView classListView = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.class_view, container, false);
        classListView = (ListView) rootView.findViewById(R.id.classList);

        return rootView;
    }
}

答案 6 :(得分:0)

findViewById必须在onViewCreated()方法

中运行
ListView classListView = null;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                     Bundle savedInstanceState) {

    return inflater.inflate(R.layout.class_view, container, false);
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    classListView = (ListView) view.findViewById(R.id.classList);
}

}`