5

FragmentStatePagerAdapterに3つのタブがあります。タブ1のフラグメントがあり、相対レイアウト内の「linearlayout」コンテナに動的にビューを追加します。タブ1フラグメントにいくつかのビューを動的に追加します。また、そのlinearLayoutコンテナーに、上下の他のビューを含む完全なフラグメントを追加しました。これはうまくいきます..すべてがうまくいきます。

でも3ページ目に行って戻ってきたら。すべてのビューがあります。しかし、その完全なフラグメントは消えます~~ 編集
それはtab1から消え、別の子フラグメントが追加されたtab2のビューの下に表示されます。

まず、tab1とtab2にlistFragmentがあります。listItemクリックに基づいて各タブにフラグメントをロードします。tab1と2の両方のフラグメントが同じ下のxmlを膨らませて動的ビューを追加しますが、場合によっては、xmlで指定された線形レイアウトのビューの代わりに完全なフラグメントを追加します。 リストだけがあった後、タブ1とタブ2の両方に新しく追加されたフラグメントに2つのフラグメントを追加し、タブ3にスライドする必要がある場合に、問題が発生しました。戻ったとき。「tab1メインフラグメント」のフラグメントが消え、「tab2メインフラグメント」のフラグメントの下に表示されました

これはビューページャーで、メソッドsetItem(fragment、position)によってさまざまなフラグメントを変更します。

public static class ScreenSlidePagerAdapter extends
        FragmentStatePagerAdapter {

    public static ArrayList<Fragment> tabs_fragments = new ArrayList<Fragment>(
            3);

    public ScreenSlidePagerAdapter(FragmentManager fm,
            ArrayList<Fragment> tabs) {
        super(fm);
        ScreenSlidePagerAdapter.tabs_fragments = tabs;
    }

    @Override
    public Fragment getItem(int arg0) {
        return tabs_fragments.get(arg0);
    }

    @Override
    public int getCount() {
        return tabs_fragments.size();
    }

    @Override
    public int getItemPosition(Object object) {
        if (tabs_fragments.contains(object)) {
            return POSITION_UNCHANGED;
        }
        return POSITION_NONE;
    }

    public static void setItem(Fragment fr, int position) {
        if (position <= 2 && position >= 0) {
            tabs_fragments.remove(position);
            tabs_fragments.add(position, fr);
        } else
            Log.d("adding tab", "wrong tab position to add fragment at");
    }
}

これは、フラグメントをlinearlayoutに追加する方法です。ここで、「ll」は相対レイアウト内の線形レイアウト、つまりtab1のフラグメントの実際のコンテンツビューです。

ll.addView(getTitle("Set Message Receive Settings"));
        // View smsRecLayout = inflater.inflate(R.layout.fr_ev_sms_receive,
        // container, false);
        Bundle b = new Bundle();
        b.putInt("id", eventId);
        b.putInt("event", eventTypeId);
        Fragment fr = new FrEv_SMSReceive();
        fr.setArguments(b);
        getFragmentManager().beginTransaction()
                .add(ll.getId(), fr, "fr_sms_receive").commit();

これは、線形レイアウト'fr_event_container'に別のフラグメントが追加されたフラグメントのレイアウトです。FragmentStatePagerAdapter

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".EventDetails" >

<TextView
    android:id="@+id/title"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:gravity="center_horizontal"
    android:padding="10dp"
    android:textIsSelectable="false" />

<ScrollView
    android:id="@+id/fr_event_container_scroll"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:layout_above="@+id/sep1"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/title" >

    <LinearLayout
        android:id="@+id/fr_event_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
    </LinearLayout>
</ScrollView>

<View
    android:id="@+id/sep1"
    android:layout_width="fill_parent"
    android:layout_height="2dp"
    android:layout_above="@+id/addOther"
    android:layout_centerHorizontal="true"
    android:layout_margin="10dp"
    android:background="#000"
    android:padding="10dp"
    android:visibility="gone" />

<Button
    android:id="@+id/next"
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/addOther"
    android:layout_alignBottom="@+id/addOther"
    android:layout_alignParentRight="true"
    android:layout_marginRight="54dp"
    android:text="Next"
    android:width="90dp" />

4

2 に答える 2

11

ViewPagerには、オフスクリーンページの最大制限があります。あなたはそれをより高く設定することができますsetOffscreenPageLimit(int)

于 2013-03-27T09:57:49.037 に答える
0

問題は、実行時にIDを変更せずに両方のタブに同じレイアウトを使用することであることがわかりましたsetId

フラグメントは異なるタブにありましたが、Androidは最初に追加されたレイアウトをメインとして扱っていたため、tab1の後にtab2にフラグメントを追加すると、そのレイアウトのtab2またはtab2バージョンで追加されたものはすべてtab1(最初に追加された)になります。

実行時にlayoutIdsを変更すると、問題は解決しました。

于 2013-03-28T17:00:19.523 に答える