简体   繁体   English

如何在viewPager中使用相同的片段?

[英]How to use same fragment in a viewPager?

I develope currently a small sample app with fragments and a viewPager. 我开发了一个带有片段和viewPager的小样本应用程序。 The viewPager shows 3 pages. viewPager显示3页。 In each page i instantiate a fragment of the same type. 在每个页面中,我实例化相同类型的片段。 The fragment contains a textView and a button. 该片段包含textView和一个按钮。 On button click I want to replace the current fragment with another one. 在按钮单击时,我想用另一个片段替换当前片段。 Now my problem is, no matter which button I press only the fragment of page 1 gets replaced. 现在我的问题是,无论我按哪个按钮,只有第1页的片段被替换。 I dont know what I have to do in my pageAdapter class but I guess it has to do with using the same fragment and layout. 我不知道我在pageAdapter类中要做什么,但我想这与使用相同的片段和布局有关。 I think I have to make sure, that my pageAdapter updates the correct page, but how do I achieve that? 我想我必须确保我的pageAdapter更新了正确的页面,但我该如何实现呢?

For a better understanding why I want to achieve that, that I receive a json string within 3 node of type menu and I want to use each of them as a page in my viewPager. 为了更好地理解为什么我想实现这一点,我在类型菜单的3个节点中收到一个json字符串,我想将它们中的每一个用作我的viewPager中的页面。

Can someone show me a short and easy example for such a behavior? 有人能告诉我这种行为的简短例子吗? I think its a basic approach, so it cant be so difficult. 我认为这是一种基本方法,所以它不可能如此困难。

--------Edit--------- - - - - 编辑 - - - - -

Here is the code: 这是代码:

public class FragmentPagerSupport extends FragmentActivity {
static final int NUM_ITEMS = 4;
MyAdapter mAdapter;
ViewPager mPager;

@Override
public void onBackPressed() {
    FragmentManager fm = getFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
        fm.popBackStack();
    } else {
        super.onBackPressed();
    }
}

public MyAdapter getmAdapter() {
    return mAdapter;
}

public ViewPager getmPager() {
    return mPager;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_pager);
    mAdapter = new MyAdapter(getFragmentManager(), this);
    mPager = (ViewPager) findViewById(R.id.pager);
    mPager.setOffscreenPageLimit(NUM_ITEMS + 2);
    mPager.setAdapter(mAdapter);

    Button button = (Button) findViewById(R.id.goto_first);
    button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            mPager.setCurrentItem(0);
        }
    });

    button = (Button) findViewById(R.id.goto_last);
    button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            mPager.setCurrentItem(NUM_ITEMS - 1);
        }
    });
}
}

MyAdapter: MyAdapter:

public MyAdapter(FragmentManager fm, FragmentPagerSupport fragmentPagerSupport) {
super(fm);
this.fragmentPagerSupport = fragmentPagerSupport;
}

@Override
public int getCount() {
return NUM_ITEMS;
}

@Override
public Fragment getItem(int position) {
        Fragment newInstance = null;
        switch (position) {
        case 0:
            newInstance = frag1.newInstance(position);
            break;
        case 1:
            newInstance = frag1.newInstance(position);
            break;
        case 2:
            newInstance = frag2.newInstance(position);
            break;
        case 3:
            newInstance = frag2.newInstance(position);
            break;
        }
        return newInstance;
    }

Frag1 & Frag2 & ListItemFrag: Frag1&Frag2&ListItemFrag:

    public static class frag1 extends ListFragment {
    int mNum;
    static frag1 newInstance(int num) {
        frag1 f = new frag1();
        Supply num input as an argument.
        Bundle args = new Bundle();
        args.putInt("num", num);
        f.setArguments(args);
        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mNum = getArguments() != null ? getArguments().getInt("num") : 1;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_pager_list, container, false);
        v.setId(mNum);
        View tv = v.findViewById(R.id.text);
        ((TextView) tv).setText("Fragment #" + mNum);
        return v;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        String[] cheeses = { "Edamer", "Gauda", "Cheddar", "Mozarella", "Maasdamer" };
        setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, cheeses));
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        Log.i("FragmentList", "Item clicked: " + id);
        String itemName = (String) l.getItemAtPosition(position);
        Fragment listItemFragment = ListItemFragment.newInstance(itemName);
        FragmentTransaction trans = getActivity().getFragmentManager().beginTransaction();
        trans.replace(R.id.root, listItemFragment, listItemFragment.getClass().getName() + "_" + mNum);
        trans.addToBackStack(itemName);
        trans.commit();
    }
}

public static class frag2 extends ListFragment {
    int mNum;
    static frag2 newInstance(int num) {
        frag2 f = new frag2();
        Bundle args = new Bundle();
        args.putInt("num", num);
        f.setArguments(args);
        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mNum = getArguments() != null ? getArguments().getInt("num") : 1;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_pager_list, container, false);
        v.setId(mNum);
        View tv = v.findViewById(R.id.text);
        ((TextView) tv).setText("Fragment #" + mNum);
        return v;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        String[] cheeses = { "Edamer", "Gauda", "Cheddar", "Mozarella", "Maasdamer" };
        setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, cheeses));
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        Log.i("FragmentList", "Item clicked: " + id);
        String itemName = (String) l.getItemAtPosition(position);
        Fragment listItemFragment = ListItemFragment.newInstance(itemName);
        FragmentTransaction trans = getActivity().getFragmentManager().beginTransaction();
        trans.replace(R.id.root, listItemFragment, listItemFragment.getClass().getName() + "_" + mNum);
        trans.addToBackStack(itemName);
        trans.commit();
    }
}

public static class ListItemFragment extends Fragment {
    String itemName;
    static ListItemFragment newInstance(String itemName) {
        ListItemFragment i = new ListItemFragment();
        Bundle args = new Bundle();
        args.putString("text", itemName);
        i.setArguments(args);
        return i;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        itemName = getArguments() != null ? getArguments().getString("text") : "NULL";
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_item, container, false);
        View tv = v.findViewById(R.id.textView1);
        ((TextView) tv).setText("Cheese: " + itemName + " selected!");
        return v;
    }
}

Pager Layout: 寻呼机布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:padding="4dip"
    android:gravity="center_horizontal"
    android:layout_width="match_parent" android:layout_height="match_parent">
<android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1">
</android.support.v4.view.ViewPager>
<LinearLayout android:orientation="horizontal"
        android:gravity="center" android:measureWithLargestChild="true"
        android:layout_width="match_parent" android:layout_height="wrap_content"
        android:layout_weight="0">
    <Button
        android:id="@+id/goto_first"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="first" />
    <Button android:id="@+id/goto_last"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="last">
    </Button>
</LinearLayout>

Frag1 Layout: Frag1布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#99EE11"
android:id="@+id/test">
<TextView android:id="@+id/text"
    android:layout_width="match_parent" android:layout_height="wrap_content"
    android:gravity="center_vertical|center_horizontal"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:text="@string/hello_world"/>
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="0dip"
    android:layout_weight="1"
    android:id="@+id/root" >
    <ListView android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:drawSelectorOnTop="false"/>
</FrameLayout>

Frag2 Layout: Frag2布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#99EE11"
android:id="@+id/test2">
<TextView android:id="@+id/text"
    android:layout_width="match_parent" android:layout_height="wrap_content"
    android:gravity="center_vertical|center_horizontal"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:text="@string/hello_world"/>
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="0dip"
    android:layout_weight="1"
    android:id="@+id/root2" >
    <ListView android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:drawSelectorOnTop="false"/>
</FrameLayout>

ListItemFrag Layout: ListItemFrag布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginTop="230dp"
android:background="#AA33EE"
android:orientation="vertical" >
<TextView
    android:id="@+id/textView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>

Hi I was facing same kind of issue. 嗨,我遇到了同样的问题。 I fixed the issue by using 我通过使用修复了这个问题

getChildFragmentManager().beginTransaction()

instead of 代替

getActivity().getSupportFragmentManager().beginTransaction()

As in this case we are trying to make transaction from within a fragment (one out of the list of fragments which are attached to the ViewPager, thus the Activity holding the ViewPager) so we have to use getChildFragmentManager() here for desired results. 在这种情况下,我们试图从一个片段中进行事务处理(连接到ViewPager的片段列表中的一个,因此持有ViewPager的Activity),因此我们必须在此处使用getChildFragmentManager()来获得所需的结果。

NOTE: I am using android support v4 library and thus corresponding FragmentManager. 注意:我使用的是android支持v4库,因此对应的FragmentManager。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM