Fragment 内的 ListView 给了我 null
ListView inside Fragment gives me null
在我的片段的 onCreate 方法中,我试图设置一个 ListView。问题是我写了这一行,
ListView listViewEmployees = (ListView) getActivity().findViewById(R.id.listViewEmployees);
并且似乎无法找到 ListView,因为它总是获取 null 值。
<!-- TODO: Update blank fragment layout -->
<TextView android:layout_width="match_parent" android:layout_height="match_parent"
android:text="@string/hello_blank_fragment"
android:id="@+id/textViewHelloEmployees" />
<ListView
android:layout_width="wrap_content"
android:layout_height="293dp"
android:id="@+id/listViewEmployees"
android:layout_gravity="center" />
片段代码:
public class FragmentEmoployees extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
private CollectionEmployee allEmployees;
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment FragmentEmoployees.
*/
// TODO: Rename and change types and number of parameters
public static FragmentEmoployees newInstance(String param1, String param2) {
FragmentEmoployees fragment = new FragmentEmoployees();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
public FragmentEmoployees() {
// Required empty public constructor
}
public FragmentEmoployees(CollectionEmployee allEmployees) {
// Required empty public constructor
this.allEmployees = allEmployees;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
ListView listViewEmployees = (ListView) getActivity().findViewById(R.id.listViewEmployees);
System.out.println(listViewEmployees);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_employee, container, false);
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* <p/>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
public void onFragmentInteraction(Uri uri);
}
}
您将无法在 onCreate()
中访问 Fragment 的视图,因为 Fragment 还没有视图。 Fragment 在方法 onCreateView()
中获取分配给它的视图,该方法在 onCreate()
之后调用。您必须在 onCreateView()
或之后调用的方法中设置您的 ListView。
如果您稍后想访问 Fragment 的视图,则必须使用方法 getView()
。当您在 getActivity()
上调用 getViewById()
时,它将在您的 activity 视图中搜索 ListView,而不是片段。
在我的片段的 onCreate 方法中,我试图设置一个 ListView。问题是我写了这一行,
ListView listViewEmployees = (ListView) getActivity().findViewById(R.id.listViewEmployees);
并且似乎无法找到 ListView,因为它总是获取 null 值。
<!-- TODO: Update blank fragment layout -->
<TextView android:layout_width="match_parent" android:layout_height="match_parent"
android:text="@string/hello_blank_fragment"
android:id="@+id/textViewHelloEmployees" />
<ListView
android:layout_width="wrap_content"
android:layout_height="293dp"
android:id="@+id/listViewEmployees"
android:layout_gravity="center" />
片段代码:
public class FragmentEmoployees extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
private CollectionEmployee allEmployees;
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment FragmentEmoployees.
*/
// TODO: Rename and change types and number of parameters
public static FragmentEmoployees newInstance(String param1, String param2) {
FragmentEmoployees fragment = new FragmentEmoployees();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
public FragmentEmoployees() {
// Required empty public constructor
}
public FragmentEmoployees(CollectionEmployee allEmployees) {
// Required empty public constructor
this.allEmployees = allEmployees;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
ListView listViewEmployees = (ListView) getActivity().findViewById(R.id.listViewEmployees);
System.out.println(listViewEmployees);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_employee, container, false);
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* <p/>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
public void onFragmentInteraction(Uri uri);
}
}
您将无法在 onCreate()
中访问 Fragment 的视图,因为 Fragment 还没有视图。 Fragment 在方法 onCreateView()
中获取分配给它的视图,该方法在 onCreate()
之后调用。您必须在 onCreateView()
或之后调用的方法中设置您的 ListView。
如果您稍后想访问 Fragment 的视图,则必须使用方法 getView()
。当您在 getActivity()
上调用 getViewById()
时,它将在您的 activity 视图中搜索 ListView,而不是片段。