android - fragment 重叠在另一个 fragment 上

标签 android fragment fragment-tab-host

我知道在 SO 上发布了与该问题相关的各种问题,但没有一个为我提供解决方案。我在 fragment activity 中有 4 个选项卡,每个选项卡都有自己的 fragment。我将进入其中的另一个 fragment。当我切换到标签时,有时它会重叠并且两者都可见。

这是代码(xml):

<Button
    android:id="@+id/checkBal"
    android:layout_width="fill_parent"
    android:layout_height="45dp"
    android:clickable="false"
    android:gravity="left|center_vertical"
    android:typeface="serif" />

<View
    android:layout_width="fill_parent"
    android:layout_height="2dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginTop="2dp"
    android:background="@color/green" />

<FrameLayout
    android:id="@+id/realtabcontent"
    android:layout_width="match_parent"
    android:layout_height="0dip"
    android:layout_weight="1" />

<android.support.v4.app.FragmentTabHost
    android:id="@android:id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="0" />
</android.support.v4.app.FragmentTabHost>

public class Tab_Activity extends FragmentActivity {

FragmentTabHost mHost;
Button balance;


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tabs);

    balance = (Button) findViewById(R.id.checkBal);
    mHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
    mHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

    mHost.addTab(mHost.newTabSpec("Home").setIndicator("Home"),
            Home_Fragment.class, null);
    mHost.addTab(mHost.newTabSpec("Number").setIndicator("Send to number"),
            Number_Fragment.class, null);
    mHost.addTab(
            mHost.newTabSpec("Contact").setIndicator("Send to contacts"),
            Contact_Fragment.class, null);
    mHost.addTab(mHost.newTabSpec("Group").setIndicator("Send to groups"),
            Group_Fragment.class, null);

    mHost.setOnTabChangedListener(new OnTabChangeListener() {

        @Override
        public void onTabChanged(String tabId) {
            // TODO Auto-generated method stub

            if (tabId.equalsIgnoreCase("Home")) {

                Home_Fragment home = new Home_Fragment();

                FragmentManager manager = getSupportFragmentManager();
                FragmentTransaction ft = manager.beginTransaction();
                ft.replace(R.id.realtabcontent, home, "Home");
                ft.commit();

            }

            if (tabId.equalsIgnoreCase("Number")) {

                Number_Fragment number = new Number_Fragment();

                FragmentManager manager = getSupportFragmentManager();
                FragmentTransaction ft = manager.beginTransaction();
                ft.replace(R.id.realtabcontent, number, "Number");
                ft.commit();

            }
            if (tabId.equalsIgnoreCase("Contact")) {

                Contact_Fragment contact = new Contact_Fragment();

                FragmentManager manager = getSupportFragmentManager();
                FragmentTransaction ft = manager.beginTransaction();
                ft.replace(R.id.realtabcontent, contact, "Contact");
                ft.commit();
            }

            if (tabId.equalsIgnoreCase("Group")) {

                Group_Fragment group = new Group_Fragment();

                FragmentManager manager = getSupportFragmentManager();
                FragmentTransaction ft = manager.beginTransaction();

                ft.replace(R.id.realtabcontent, group, "Group");
                ft.commit();
            }

        }
    });

}




public void newFragment(Fragment fragment, String tag) {

    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction ft = manager.beginTransaction();
    //
    if (tag.equalsIgnoreCase("Group"))
        ft.remove(new Group_Fragment());
    else
        ft.remove(new Contact_Fragment());
    ft.replace(R.id.realtabcontent, fragment);
    ft.addToBackStack(null);
    ft.commit();

}

public void updateContacts(ArrayList<String> cList) {

    FragmentManager manager = getSupportFragmentManager();

    Contact_Fragment contactFrag = (Contact_Fragment) manager
            .findFragmentByTag("Contact");
    contactFrag.updateData(cList);

}

 }

在新 fragment 中调用 fragment

mActivity.newFragment(new Select_Group_Fragment(), "Group");

当我从另一个 fragment 调用 fragment 时,我需要在 Tab_Activitynew fragment 方法中添加 addToBackStack

Overlapped screenshot

请大家帮忙

最佳答案

根据我在 Fragments 上看到的所有内容,即 Google IO、StackOverflow 等,这不是处理它的方法。该 Activity 应控制哪个 fragment 是 Activity 的。 fragment 应该服从 fragment 控制的 Activity 。您可能必须将 fragment 之间的数据传递给 Activity 。 Google 开发人员强烈反对 fragment 到 fragment 的通信。 fragment 是屏幕的一个子集。

您的叠加层看起来像是同时激活了 2 个 fragment 。

仅供引用。最好使用 Fragment Transactions 在一个 Activity 中操作多个 fragment 。启动从 xml 启动 fragment 的 Activity 不能真正被 fragment 事务操作。

希望这对您有所帮助。

关于android - fragment 重叠在另一个 fragment 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17429158/

相关文章:

android - 在 fragment TabHost 中刷新 ListView

android - 如何在应用程序中维护 fragment 的状态

android - fragment 无法转换为 android.support.v4.app.Fragment

android - 如何在没有 XML 的情况下以编程方式将 fragment 添加到 Activity

android - 在 android 的 ScrollView 底部添加填充?

android - SQLite:如何根据时间戳限制行数?

java - 安卓 : convert binary string to byte

android - 滑动菜单 Android

android - 配置(方向)更改时的嵌套 fragment

java - 临时更改可绘制颜色