如何为具有不同内容的三个选项卡使用相同的片段?

时间:2013-08-17 14:37:10

标签: android android-fragments

我有一个描述三种不同运动的枚举:

public enum MatchType {
    S1(0, "Sport1", "xml stream address", R.id.match_list, R.layout.fragment_match_list, R.color.separator_sport1),
    S2(0, "Sport2", "xml stream address", R.id.match_list, R.layout.fragment_match_list, R.color.separator_sport2),
    S3(0, "Sport3", "xml stream address", R.id.match_list, R.layout.fragment_match_list, R.color.separator_sport3);

    ...getters/setters

}

然后我用

分段
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    matchesArrayAdapter = new MatchListAdapter(getActivity(), new ArrayList<Match>());

    return inflater.inflate(matchType.getLayout(), container, false);
}

同样在我的片段中,我有一个AsyncTask,我有这个

@Override
protected void onPostExecute(final List<Match> matches) {
    if (matches != null) {
        matchListView = (ListView) getActivity().findViewById(matchType.getRId());

        [setup listeners]

        matchesArrayAdapter.matchArrayList = matches;
        matchListView.setAdapter(matchesArrayAdapter);
    }
}

修改 在我的活动中,我有一个带

的AppSectionsPagerAdapter
public Fragment getItem(int i) {
    MatchListSectionFragment fragment = new MatchListSectionFragment();
    Bundle bundle = new Bundle();
    bundle.putInt(Constants.MATCH_TYPE, i);
    fragment.setArguments(bundle);
    return fragment;
}

编辑2: 这是我片段中的onCreate和onCreateView:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle bundle = getArguments();
    matchType = MatchType.getMatchType(bundle.getInt(Constants.MATCH_TYPE));
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    matchesArrayAdapter = new MatchListAdapter(getActivity(), new ArrayList<Match>());
    return inflater.inflate(matchType.getLayout(), container, false);
}

AsyncTask为我的枚举中的每个运动读取xml流,但我的问题是选项卡#1被选项卡#2和随后的选项卡#3覆盖。

在我为每项运动定义一个片段之前,肯定没有必要吗?

如何为每项运动使用相同布局的相同片段?

3 个答案:

答案 0 :(得分:1)

在Activity中实例化片段时,使用Bundle设置Fragment的参数。

Bundle myBundle = new Bundle();
myBundle.putInt(MY_EXTRA, 1);
myFragment.setArguments(myBundle);

在你的包中放入一些Extra,它将在片段的onCreate()回调中读取。

int i = getArguments().getInt(MY_EXTRA);

答案 1 :(得分:0)

我在移动设备上。 将三个FrameLayouts放在LinearLayout中,名为frame1,frame2和frame 3.这将是您的主要Activity的布局。 然后在Activity的oncreate()方法中,调用getFragmentManager()。getFragmentTransaction()。 实例化三个片段并将它们发送给它们,最好是通过Bundle。 在Fragment Transaction上为每个片段调用add()或replace()方法,第一个参数是相应FrameLayout的id,第二个参数是片段本身。 调用commit()。

答案 2 :(得分:0)

您应该在片段中创建newInstance方法,也应该在片段中存储MatchType instansce。

MatchType matchType;

public static MyFragment newInstance(MatchType matchType) {
          MyFragment fragment = new MyFragment();
          fragment.matchType = matchType;
          return fragment;
}

在您的Activity中,您应该使用此方法创建3个MyFragment实例(与其拥有MatchType的每个片段相关)。然后在onCreateView方法中,您应该从matchType中将数据插入到视图中。

抱歉,我在移动设备上。对不起我的英语。

<强>更新

检查变量 matchType 。也许它被宣称为静态