【问题标题】:In ViewPager, on sliding to 3rd tab, child fragment in tab1 disappears在 ViewPager 中,滑动到第三个选项卡时,tab1 中的子片段消失
【发布时间】:2013-03-27 09:51:00
【问题描述】:

我在 FragmentStatePagerAdapter 中有 3 个选项卡。 我有一个选项卡 1 的片段,它动态地将视图添加到相对布局内的“线性布局”容器中。 我在选项卡 1 片段中动态添加了一些视图。我还在该 linearLayout 容器中添加了一个完整的片段,以及上下其他视图。这很好用.. 一切都很好。

但是当我转到第 3 页并回来时。所有的观点都在那里。但是那个完整的片段消失了~~ 编辑
它从 tab1 消失,并出现在 tab2 中添加另一个子片段的视图下方..

首先我在tab1 和tab2 中有一个listFragment。基于 listItem 单击我在每个选项卡中加载一个片段,tab1 和 2 中的两个片段在 xml 下膨胀相同并添加动态视图,但在某些情况下,我添加一个完整的片段而不是 xml 中给出的线性布局中的视图。 问题 当我必须在选项卡 1 和选项卡 2 中的两个新添加的片段中添加两个片段时,只有列表,然后滑动到选项卡 3。回来时。 “tab1 主片段”中的片段消失并出现在“tab2 主片段”中的片段下方

这是 viewpager,我在其中通过 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");
    }
}

这就是我将片段添加到线性布局的方式,其中“将”是相对布局内的线性布局,即 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" />

【问题讨论】:

    标签: android android-layout android-fragments android-viewpager


    【解决方案1】:

    ViewPager 有一个最大的离屏页面限制。 您可以使用setOffscreenPageLimit(int) 将其设置得更高

    【讨论】:

    • 其实我注意到,当转到 tab3 时,来自 tab1 的片段会出现并添加到 tab2 的视图下。其中使用与 tab1 中相同的 relativeLayout 副本。复制两个选项卡的相同布局是否有问题?我在两个标签的给定布局之上膨胀。
    • 对不起,我不得不承认没有阅读你的整个代码,并假设你忘记了这个常见的陷阱。也许您可以发布更多代码,因为我们实际上看不到您的 viewpager 等。我也不是 100% 清楚您正在尝试做什么,将片段添加到您的布局中。
    • 顺便说一下,您的解决方案也适用。但我不明白是什么问题。谢谢。但我不能赞成我的声誉低于 15 :-/
    • 好的,我上传更多代码为他人解决问题。
    • ViewPager 会自动销毁实际上看不到的 Fragments(/tabs) 以节省内存等。使用 setOffscreenPageLimit,您可以将此限制设置为高。如果将此设置为 2,则意味着您始终可以拥有 3 个(1 个可见,2 个在屏幕外),而 ViewPager 不会破坏它们,并在您滚动回它们时重新创建它们。如果问题是在重新创建之后(所以当不使用 setOffscreenPageLimit 时)你的片段搞砸了,那么你的重新添加/重新创建搞砸了;)
    【解决方案2】:

    我知道问题在于对两个选项卡使用相同的布局而不在运行时通过setId 更改其 ID;

    虽然片段位于不同的选项卡中,但 Android 将首先添加的布局视为主布局,因此如果我在 tab1 之后在 tab2 中添加了一个片段,那么在该布局的 tab2 或 tab2 版本中添加的任何东西都会进入 tab1(首先添加)。

    我在运行时更改了 layoutIds,问题解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 2012-04-16
      • 1970-01-01
      相关资源
      最近更新 更多