从片段创建新片段,片段是ViewPager的一部分

时间:2013-08-09 01:01:49

标签: android android-fragments android-viewpager android-listfragment

我看过很多看似相关的问题,但是我找不到那个我正在寻找的问题。

我有一个应用程序,在MainActivity中有一个ViewPager。 ViewPager中的一个片段是ListFragment。 我想在用户单击List项时启用新Fragment的创建, 使用onListItemClick函数。 新的Fragment将取代ViewPager,并将显示其布局和数据。 我还想允许单击“后退”按钮,这将使用户返回到PageViewer的先前状态。

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
        StationDescriptionFragment newFragment = new StationDescriptionFragment();
        Bundle args = new Bundle();
        args.putString(StationDescriptionFragment.ARG_DESCRIPTION, this.stationsList.get(position).getDescription());
        newFragment.setArguments(args);
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        transaction.replace(R.id.fragment_container, newFragment);
        transaction.addToBackStack(null);
        transaction.commit();
        getListView().setItemChecked(position, true);
    }

此代码位于Fragment中,它是ViewPager的一部分。 此代码结束后,此应用程序结束后,应用程序崩溃。我确信这个功能结束了。

崩溃是:

FragmentManagerImpl.throwException(RuntimeException) line: 462

StationDescriptionFragment类:

public class StationDescriptionFragment extends Fragment {
    final static String ARG_DESCRIPTION = "description";
    String mCurrentDescription = "";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (savedInstanceState != null) {
            mCurrentDescription = savedInstanceState.getString(ARG_DESCRIPTION);
        }
        return inflater.inflate(R.layout.description_view, container, false);
    }

    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        updateDescription("Some Description");
    }

    public void updateDescription(String description) {
        TextView desc = (TextView) getActivity().findViewById(R.id.description);
        desc.setText(description);
        mCurrentDescription = description;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString(ARG_DESCRIPTION, mCurrentDescription);
    }
}

description_view.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/description"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    android:textSize="18sp" />

任何帮助将不胜感激。 感谢。

1 个答案:

答案 0 :(得分:1)

  

新的Fragment将取代ViewPager,并将显示它   布局和数据。我还想允许点击后退按钮   将用户返回到PageViewer的先前状态。

如果您想要替换ViewPager(我假设在另一个片段中)及其页面片段,请使用普通FragmentManager而不是getChildFragmentManager()返回的getChildFragmentManager()。旨在实现嵌套片段。 R.id.fragment_container会在当前片段的视图中查找该id(将新片段放入),我认为ViewPager是容纳{{1}的片段的容器的id }:

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
        getListView().setItemChecked(position, true); // call this before the transaction 
        StationDescriptionFragment newFragment = new StationDescriptionFragment();
        Bundle args = new Bundle();
        args.putString(StationDescriptionFragment.ARG_DESCRIPTION, this.stationsList.get(position).getDescription());
        newFragment.setArguments(args);
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.replace(R.id.fragment_container, newFragment);
        transaction.addToBackStack(null);
        transaction.commit();
}