我有一个管理片段列表的活动。其中之一是 ListFragment,当活动在 Create() 期间尝试找到它时,我得到一个 Null 异常。
Caused by: java.lang.NullPointerException
at com.example.foodexp01b.MainActivity.onCreate(MainActivity.java:154)
ListFragment 尚未创建,但我需要像其他人一样将它放入片段数组中。我该怎么办?
活动
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
uiHelper = new UiLifecycleHelper(this, callback);
uiHelper.onCreate(savedInstanceState);
FragmentManager fm = getSupportFragmentManager();
fragments[LOGIN] = fm.findFragmentById(R.id.loginFragment);
fragments[HOME] = fm.findFragmentById(R.id.homeFragment);
fragments[SETTINGS] = fm.findFragmentById(R.id.settingsFragment);
fragments[SETTINGS].getView().findViewById(R.id.back_button1)
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
currentFragment = HOME;
showFragment(HOME, false);
}
});
fragments[DESTINATIONS] = fm.findFragmentById(R.id.destinationFragment);
fragments[DESTINATIONS].getView().findViewById(R.id.back_button2)
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
currentFragment = HOME;
showFragment(HOME, false);
}
});
fragments[MAP] = fm.findFragmentById(R.id.mapFragment);
fragments[RESTAURANT] = fm.findFragmentById(R.id.restaurantFragment);
fragments[RESTAURANT].getView().findViewById(R.id.restaurant_back_button)
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
currentFragment = MAP;
showFragment(MAP, false);
}
});
fragments[FAVORITES].getView().findViewById(R.id.favoritesFragment);
FragmentTransaction transaction = fm.beginTransaction();
for(int i = 0; i < fragments.length; i++) {
transaction.hide(fragments[i]);
}
transaction.commit();
}
ListFragment 代码
public class FavoritesFragment extends ListFragment{
private ListView listView;
private List<BaseListElement> listElements;
OnFavoritesFragmentListener mCallback;
ArrayList<String> favorites;
// Container Activity must implement this interface
public interface OnFavoritesFragmentListener {
public void onSearchSelected();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (OnFavoritesFragmentListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFavoritesFragmentListener");
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState){
favorites = new ArrayList<String>();
setListAdapter(new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, favorites));
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
//do something
}
}
编辑
活动.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<fragment android:name="com.example.foodexp01b.HomeFragment"
android:id="@+id/homeFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<fragment android:name="com.example.foodexp01b.LoginFragment"
android:id="@+id/loginFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<fragment android:name="com.example.foodexp01b.SettingsFragment"
android:id="@+id/settingsFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<fragment android:name="com.example.foodexp01b.DestinationFragment"
android:id="@+id/destinationFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<fragment
android:id="@+id/mapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.SupportMapFragment"/>
<fragment android:name="com.example.foodexp01b.RestaurantFragment"
android:id="@+id/restaurantFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<fragment android:name="com.example.foodexp01b.FavoritesFragment"
android:id="@+id/favoritesFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>