2016-03-29 14 views
0

FragmentTabHostをホストするフラグメントがあります。すべてのタブ変更イベントで、子フラグメントからメソッドを実行します。しかし、このメソッドは常にnullポインタ例外をスローします。子フラグメントのメソッドを実行できません

public class InboxFragment extends Fragment { 

    private Context mContext; 
    private StaticListView mMessageListView; 
    private DatabaseHandler mDatabaseHandler; 
    private MessageListAdapter mMessageListAdapter; 
    private ArrayList<Message> mMessageList; 
    private TextView mFragmentTitle; 
    public boolean isLoaded = false; 

    public InboxFragment() { 
    } 

    public static InboxFragment newInstance() { 
     Bundle args = new Bundle(); 

     InboxFragment fragment = new InboxFragment(); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    public static InboxFragment newInstance(Bundle args) { 
     InboxFragment fragment = new InboxFragment(); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     final View rootView = inflater.inflate(R.layout.fragment_detail, container, false); 

     mContext = getContext(); 

     updateView(); 
     return rootView; 
    } 

    public void updateView() { 
     Bundle args = getArguments(); 

     LocalDate selectedDate; 

     if (args != null) { 
      int selectedYear = args.getInt(Application.KEY_YEAR), 
        selectedMonth = args.getInt(Application.KEY_MONTH), 
        selectedDay = args.getInt(Application.KEY_DAY); 

      selectedDate = new LocalDate(
        selectedYear, 
        selectedMonth, 
        selectedDay 
      ); 
     } else { 
      selectedDate = LocalDate.now(); 
     } 
    } 
} 

mInboxFragment.updateView()の呼び出しは常にNullPointerExceptionを返します。

public class OverviewFragment extends Fragment { 

    private Context mContext; 

    private FragmentTabHost mTabHost; 

    private EventFragment mEventFragment; 
    private AttendanceFragment mAttendanceFragment; 
    private InboxFragment mMessageFragment; 

    public OverviewFragment() { 
     mContext = getContext(); 
    } 

    /** 
    * Returns a new instance of this fragment for the given section number. 
    */ 
    public static OverviewFragment newInstance() { 

     Bundle args = new Bundle(); 

     OverviewFragment fragment = new OverviewFragment(); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    public static OverviewFragment newInstance(Bundle args) { 

     OverviewFragment fragment = new OverviewFragment(); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     final View rootView = inflater.inflate(R.layout.fragment_overview, container, false); 

     mContext = getContext(); 

     mEventFragment = EventFragment.newInstance(); 
     mAttendanceFragment = AttendanceFragment.newInstance(); 
     mMessageFragment = InboxFragment.newInstance(); 

     mTabHost = (FragmentTabHost) rootView.findViewById(android.R.id.tabhost); 
     mTabHost.setup(mContext, getChildFragmentManager(), android.R.id.tabcontent); 

     mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator("Events"), 
       mEventFragment.getClass(), null); 
     mTabHost.addTab(mTabHost.newTabSpec("tab2").setIndicator("Messages"), 
       mMessageFragment.getClass(), null); 
     mTabHost.addTab(mTabHost.newTabSpec("tab3").setIndicator("Attendance"), 
       mAttendanceFragment.getClass(), null); 

     mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() { 
      @Override 
      public void onTabChanged(String tabId) { 
       Bundle args = getArguments(); 

       switch (tabId) { 
        case "tab1": 
         try { 
          mEventFragment.updateView(); 
         } catch (NullPointerException e) { 
          Log.e("EventFragment", "Fragment not loaded"); 
         } 
         break; 
        case "tab2": 
         try { 
          mMessageFragment.updateView(); 
         } catch (NullPointerException e) { 
          Log.e("MessageFragment", "Fragment not loaded"); 
         } 
         break; 
        case "tab3": 
         try { 
          mAttendanceFragment.updateView(); 
         } catch (NullPointerException e) { 
          Log.e("AttendanceFragment", "Fragment not loaded"); 
         } 
       } 
      } 
     }); 

     return rootView; 
    } 

} 

これは私の子断片である: ここFragmentTabHostが含まれている私の断片です。他のすべてのクラスでも同様です。

答えて

0

インターフェイスを使用する必要があります。または、このメソッドは静的メソッドである必要があります。それ以外の場合、常にnullが返されます。

+0

nullを返す理由を教えてください。また、私のケースでインターフェイスを実装する方法もあります。 –

+0

@AayushSubedi 'mEventFragment = EventFragment.newInstance();'は、mEventFragmentの新しいインスタンスを作成しています。つまり、新しいメモリを割り当てています。したがって、このメソッドを呼び出すと、NULLポインタ例外が返されます。 –

+0

インターフェイスを実装する場合:InboxFragmentはインターフェイスを実装し、インターフェイスメソッドでメソッドを呼び出します。これで、インタフェースを使用してupdateView()メソッドを呼び出すことができます。 –

関連する問題