1

我正在用 FragmentTabHost 和两个嵌套片段做一个小应用程序。我需要从包含 FragmentTabHost 的片段中更新嵌套片段的数据,但是出于任何原因,当我单击其选项卡时,我没有第二个片段(第二个选项卡),然后我得到一个空指针异常。

这是对我的代码的测试:

TabsTransactionFragment.java,这是包含 FragmentTabHost 的 Fragment

    public class TabsTransactionFragment extends Fragment implements 
    OnTabChangeListener{

private static final String TAB_ONE_TAG = "ONE";
private static final String TAB_TWO_TAG = "TW0";

private FragmentTabHost mTabHost;
private ArrayList<Integer> mData;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mData = new ArrayList<Integer>();

    for (int i=0; i<10; i++) {
        mData.add(i);
    }

}

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

    View view = inflater.inflate(R.layout.fragment_tabs_transations,
            container, false);

    mTabHost = (FragmentTabHost) view.findViewById(android.R.id.tabhost);

    mTabHost.setup(getActivity(), getChildFragmentManager(),
            android.R.id.tabcontent);

    mTabHost.addTab(
            mTabHost.newTabSpec(TAB_ONE_TAG).setIndicator(
                    "ODD"),
                    ListDataFragment.class, null);

    mTabHost.addTab(
            mTabHost.newTabSpec(TAB_TWO_TAG).setIndicator(
                    "EVEN"),
                    ListDataFragment.class, null);

    mTabHost.setOnTabChangedListener(this);

    return mTabHost;
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    mTabHost = null;
}

private void updateDataChildFragments(String tabName) {

    if (mData != null) {
        ListDataFragment listOneFragment = 
                (ListDataFragment) getChildFragmentManager().findFragmentByTag(TAB_ONE_TAG);

        ListDataFragment listTwoFragment = 
                (ListDataFragment) getChildFragmentManager().findFragmentByTag(TAB_TWO_TAG);

        if (tabName.equalsIgnoreCase(TAB_ONE_TAG)) {

            ArrayList<Integer> odds = new ArrayList<Integer>();

            for (int i=0; i<mData.size(); i++) {
                if (mData.get(i) % 2 != 0) {
                    odds.add(mData.get(i));
                }
            }


            listOneFragment.updateData(odds);
        } else {
            ArrayList<Integer> even = new ArrayList<Integer>();
            for (int i=0; i<mData.size(); i++) {
                if (mData.get(i) % 2 != 0) {
                    even.add(mData.get(i));
                }
            }

            // Fragment two is null then crash...
            listTwoFragment.updateData(even);
        }
    }

}

@Override
public void onTabChanged(String tabName) {

    updateDataChildFragments(tabName);

}

}

每个选项卡都包含一个简单的 ListFragment,如下所示:

public class ListDataFragment extends ListFragment {


private ArrayAdapter<Integer> mAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mAdapter = new ArrayAdapter<Integer>(getActivity(), android.R.layout.simple_list_item_1);

    setListAdapter(mAdapter);
}


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

    return super.onCreateView(inflater, parent, savedInstanceState);
}

public void updateData(ArrayList<Integer> data) {

    mAdapter.addAll(data);
    mAdapter.notifyDataSetChanged();
}

}

而布局fragment_tabs_transations.xml是android.support.v4.app.FragmentTabHost的结构,有linearLayout、TabWidget和FrameLayout。

我尝试了很多事情和方法,但是一旦单击,我就不必将数据传递给第二个片段...我尝试先创建两个片段并添加到 FragmentTabHost 但我都没有...

我认为问题是它在 onTagChanged 之后附加到 FragmentTabHost 的第二个片段,那是因为我找不到它......但我不明白这种行为......:S。

任何人都可以帮助我吗?或者知道在单击其选项卡之前将数据传递到第二个片段的任何解决方案吗?

非常感谢!!

4

0 回答 0