【问题标题】:How to hide fragment in Relativelayout and show another on in it如何在 Relativelayout 中隐藏片段并在其中显示另一个片段
【发布时间】:2017-02-08 04:05:33
【问题描述】:

请求帮助执行这些步骤: 我的主要活动有一个相对布局

     <RelativeLayout
        android:id="@+id/main_framelayout_small_contain"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

1.activity 启动时将RelativeLayout 替换为fragment (f1)

2.(f1) 当用户单击时有列表视图我必须显示另一个片段 (f2) 在 f1 的地方,所以我在 MainActivity 中使用这些方法

public void set_fragment_subject(String path)
{
    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction ft=  fragmentManager.beginTransaction();
    Fragment_subjects f1 = new Fragment_subjects(path);
    Fragment_season f2 = new Fragment_season();
    ft.add(R.id.main_framelayout_small_contain,f1);
    ft.hide(f2);
    ft.commit();
}

可能看起来很奇怪,但我在搜索后这样做是因为我想在按下后退按钮时保留 f1 的数据。

问题出现当用户点击 f1 时,Activity 显示 f2 但在 f1 上方。

抱歉耽误了时间,任何人都可以帮助我正确地做我想做的事,谢谢

【问题讨论】:

  • 如果我理解正确,你想用 f2 替换 f1 而不是在 f1 上添加 f2?
  • 可以,但要隐藏 f1 数据以便稍后显示

标签: android android-layout android-studio android-fragments fragment


【解决方案1】:

您好@Ghadeer,您可以在这里访问片段,一种是正常替换旧片段,另一种是维护回栈,但我认为您需要第二种方式,因为您想首先将数据片段化为,所以请遵循以下步骤一步到位,

请采用框架布局而不是相对布局

<FrameLayout
            android:layout_width="match_parent"
            android:id="@+id/main_framelayout_small_contain"
            android:layout_height="match_parent"></FrameLayout>

在这里,我创建了我们将在代码中使用的 tow 方法,因此将您的活动放入您开始片段的位置:

public void setFragment(Fragment fragment, int container) {
        getSupportFragmentManager().beginTransaction().add(container, fragment).addToBackStack(fragment.getClass().getName()).commit();
    }

    public void popAllFragments() {
        // TODO Auto-generated method stub
        getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }

请在开始第一个片段时添加以下代码:

popAllFragments();
Fragment_subjects f1 =new Fragment_subjects();
setFragment(f1,R.id.main_framelayout_small_contain);

并在启动第二个 framgnet 时添加以下代码:

Fragment_season f2 =new Fragment_season();
 setFragment(f1,R.id.main_framelayout_small_contain);

最后在你的后退按钮上写下以下代码:

FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
    getActivity().onBackPressed(); 

试试这个可能对你有用

【讨论】:

  • 非常感谢,我试了一下,但我认为在 popallfragments 之后我们将两个片段添加到堆栈中,所以问题仍然是两个片段再次出现在彼此之上。另一件事我不明白什么和在哪里后退按钮工作的最后代码。抱歉,可以解释一下吗?
  • 如果你之前没有开始任何片段,那么你不需要定义 popAllFragments();对于最后一个,您还可以在活动的 onBackpress() 中使用此代码,getActivity().onBackPressed();这将从堆栈中一一弹出您的片段。
【解决方案2】:

您需要用新的片段替换当前片段。 这可以通过以下代码完成。

Fragment fragmentSeason = new Fragment_season();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack if needed
transaction.replace(R.id.main_framelayout_small_contain, fragmentSeason);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

在后按时,你会得到你的第一个片段。

【讨论】:

  • 谢谢,但使用替换时 f1 数据会丢失,所以我考虑隐藏以稍后显示 f1 及其数据
  • 嗨 @ghadeerdarwesh , addToBackStack 会做你的工作。此代码将替换您的第一个片段,当您按下返回按钮时,您将获得您的第一个片段。
  • 嗨,我的意思是listview中片段包含的数据会丢失
  • @ghadeerdarwesh 你试过吗?我认为它不会丢失。
【解决方案3】:

set_fragment_subject 方法中存在一些实现问题

如果你在 Fragment_1 中声明了 set_fragment_subject 方法,那么你在方法中的代码应该是这样的,

    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction ft=  fragmentManager.beginTransaction();

    final Fragment_season f2 = new Fragment_season();

    ft.add(R.id.main_framelayout_small_contain,f2);

    ft.hide(this);// Here this means the current fragment because this method is declared in Fragment_1
    ft.addToBackStack(null);
    ft.commit();

【讨论】:

    猜你喜欢
    • 2016-01-10
    • 2012-12-30
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多