2013-06-30 121 views
1

我有一个管理片段列表的活动。其中之一是一个ListFragment,当活动试图在Create()期间找到它时,我得到一个Null异常。Android findFragmentById返回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> 
+0

哪行代码是'MainActivity.java:154'? – HeatfanJohn

+0

'fragments [FAVORITES] .getView()。findViewById(R.id.favoritesFragment);' – ezy

+0

请帮忙:( – ezy

回答

2

你缺少fragments[FAVORITES] = fm.findFragmentById(R.id.favoritesFragment)

+0

我知道了,但是它是在活动xml中声明的,怎么才能得到它? – ezy

+1

为什么不你在执行'fragments [FAVORITES] .getView()'。''fragments [FAVORITES]''之前插入了@tony行,直到初始化它为止。 – HeatfanJohn

+0

呃抱歉@tony !!!现在我明白了,我完全确定我已经写了...但现在我有这个异常'引起:android.support.v4.app.SuperNotCalledException:Fragment FavoritesFragment {415dc380#6 id = 0x7f05002b}没有调用super.onActivityCreated()' – ezy

相关问题