【问题标题】:Android: Display and Hide FragmentAndroid:显示和隐藏片段
【发布时间】:2015-11-03 14:23:32
【问题描述】:

我里面有一些Activity单全屏Fragment。在Fragment 里面,我有另一个Fragment 覆盖在屏幕的底部。所以在屏幕的顶部我有Button 控制内部Fragment 的可见/隐藏:

  1. 包含Fragment的布局:

    ...
    <FrameLayout
        android:id="@+id/inner_fragment"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_below="@+id/top_part"
        android:name="com.package.InnerFragment" />
    
  2. 控制Button

    controlButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!isInnerVisible) showHideInnerFragment("show");
            else showHideInnerFragment("hide");
        }
    });
    
  3. 辅助方法showHideInnerFragment:

    private void showHideInnerFragment(String param) {
        //variables are class members...
        fragmentManager = getFragmentManager();
        fragmentTransaction = fragmentManager.beginTransaction();
        innerFragment = new InnerFragment();
        if (param.equals("show")) {
            fragmentTransaction.add(R.id.inner_fragment, innerFragment);
            isInnerVisible = true;
        } else {
            fragmentTransaction.remove(innerFragment);
            isInnerVisible = false;
        }
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }
    

嗯 - 这完全不工作......

【问题讨论】:

  • showHideInnerFragment() 还是 showHideGroupsFragment()?
  • @mjp66 错字已修复....
  • 谢谢!我会在一分钟内发布一个答案,但看起来你只是在调用该方法,而你的参数总是传递为“show”
  • @mjp66 对,我更改了 if 条件,现在它应该使用正确的“切换”逻辑。

标签: android android-fragments android-fragmentactivity fragmentmanager android-framelayout


【解决方案1】:

您的 isInnerVisible 似乎始终为假(我假设它开始时为假),这会删​​除片段但保持 isInnerVisible 为假。您可能只需要切换它:

private void showHideInnerFragment(String param) {
    //variables are class members...
    fragmentManager = getFragmentManager();
    fragmentTransaction = fragmentManager.beginTransaction();
    innerFragment = new InnerFragment();
    if (param.equals("show")) {
        fragmentTransaction.add(R.id.inner_fragment, innerFragment);
        isInnerVisible = false;
    } else {
        fragmentTransaction.remove(innerFragment);
        isInnerVisible = true;
    }
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

我还会将真/假值传递给参数而不是字符串值,这样更容易理解代码在做什么,因为现在它有点没有意义。稍后我会更新一个示例;)

编辑:这是做你想做的更好的方法:

controlButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        showHideInnerFragment(isInnerVisible);
    }
});

private void showHideInnerFragment(boolean isVisible) {
    //variables are class members...
    fragmentManager = getFragmentManager();
    fragmentTransaction = fragmentManager.beginTransaction();
    innerFragment = new InnerFragment();
    if (isVisible == false) {
        fragmentTransaction.add(R.id.inner_fragment, innerFragment);
        isInnerVisible = true;
    } else {
        fragmentTransaction.remove(innerFragment);
        isInnerVisible = false;
    }
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

【讨论】:

  • 还是不行。我怀疑FragmentManager添加和删除方法的使用不正确,应该是其他方法?
  • 嗯。我曾经做过类似于您尝试做的事情并且没有问题。我可能没有看到明显的东西。只是为了好玩而发布 xml 怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2014-09-06
相关资源
最近更新 更多