【问题标题】:Add a fragment to FrameLayout and hide the fragment below在FrameLayout中添加一个fragment并隐藏下面的fragment
【发布时间】:2015-08-07 23:39:27
【问题描述】:

情况:

我有一个带有 FrameLayout 的活动,我在其中更改片段。 我用:

getSupportFragmentManager().beginTransaction() .replace(R.id.content, fragment) .addToBackStack("name") .commit)

一切正常,问题是当我返回堆栈时,前一个片段被重新加载并且所有数据都丢失了。

可能的解决方案:

  • 恢复片段状态 - 我想避免这种情况,因为大部分数据都是从服务器检索的,并且需要很长时间
  • 使用.add(R.id.content, fragment) 而不是.add(R.id.content, fragment) 但在这种情况下,我的片段必须具有纯色背景,否则它们会相互重叠。问题是由于一些设计限制,我无法设置纯色背景。

问题:

我如何使用 '.add(R.id.content,fragment)' 并以某种方式隐藏它下面的片段,这样它就不会覆盖,我可以回到我离开它的状态的前一个片段。

【问题讨论】:

  • 如果您不想弹出片段,请不要添加到后台堆栈。
  • 那你为什么不调用另一个activity来保存新的fragment,这样你当前与fragment的activity就会被暂停。
  • @Deev 我想要弹出片段,我只是不想在当前片段下方可见。接受的答案解决了问题,谢谢
  • @Gatunox 我想留在同一个活动中,除了我的片段之外,屏幕上还有其他东西

标签: android fragment


【解决方案1】:

首先我想说,如果您不希望用户返回上一个片段,则无需将片段添加到后台堆栈。

要回答另一个问题,FragmentManager 有一个“隐藏”方法,您可以使用该方法将片段保留在 FragmentManager 中,但对用户隐藏它。然后使用“show”再次显示。

final Fragment oldFragment = methodToGetFragment();
getSupportFragmentManager().beginTransaction()
    .add(R.id.content, fragment)
    .hide(oldFragment)
    .addToBackStack("name")
    .commit)

如第一句所述,Fragment 将被弹出,当用户按下“返回”时,旧的 Fragment 将显示出来。如果您不希望这种情况发生,只需删除addToBackStack()

【讨论】:

    【解决方案2】:

    用于保存数据
    您可以在替换片段时使用Activity,活动是实时的。

            public class MotherActivity extends ActionBarActivity { 
                         private Data data = null;
    
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_adv);
    
    
               Fragment oldFragment = methodToGetFragment();
        getSupportFragmentManager().beginTransaction()
            .add(R.id.content, fragment)
            .hide(oldFragment)
            .addToBackStack("name")
            .commit)
    
    
    
            }
    public void setData(Data data){
    ....
    }
    
    public void getData(){
    ....}
    
        }
    
    
    public class FirstFragment extends Fragment {
    
        private AdvActivity act;
    
    ......
    
      public void onAttach(Activity activity) {
            super.onAttach(activity);
            // get data from internet
            Data data=getData();
            // and save data in mother activity
            activity.setData(data);
    
        }
    

    第二个片段:

    public class SecondFragment extends Fragment {
    
        private AdvActivity act;
        private Data data;
    
    ......
    
      public void onAttach(Activity activity) {
            super.onAttach(activity);
            // get data from mother activity
            data=activity.getData();
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多