【问题标题】:Fragment not showing previous data when coming from another fragment当来自另一个片段时,片段不显示以前的数据
【发布时间】:2017-12-07 08:22:59
【问题描述】:

在我的 android 活动中,我正在使用多个片段,我根据我的要求成功切换了这些片段,但问题是当我将片段 1 切换到片段 2 并从片段 2 切换回片段 1 时,片段 1 没有显示以前数据片段 1 从拉伸开始,但我想显示与我被选中相同的先前数据。

这是我的 go Fragment 1 (fragment_search_customerProfile) 到 Fragment 2 (fragment_CustomerInfo) 的代码:

FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.filterFram, new fragment_Search());

FrameLayout layout = (FrameLayout) rootView.findViewById(R.id.cpFrame);
layout.removeAllViewsInLayout();

transaction.remove(new fragment_search_customerProfile()).commit();  

这是我从 Fragment 2 (fragment_CustomerInfo) 返回 Fragment 1 (fragment_search_customerProfile) 的代码:

FragmentManager manager = getActivity().getSupportFragmentManager();


FragmentTransaction transaction = manager.beginTransaction();

Log.d("fragment_Search", fromSearch + "");
transaction.replace(R.id.custIndoFram, new fragment_search_customerProfile());

FrameLayout layout = (FrameLayout) rootView.findViewById(R.id.custIndoFram);

layout.removeAllViewsInLayout();

transaction.remove(new fragment_CustomerInfo()).commit();

谁能解释我如何保存我的片段数据?

【问题讨论】:

    标签: android android-layout android-fragments android-fragmentactivity


    【解决方案1】:

    代替transaction.replace(R.id.filterFram, new fragment_Search()); ,您可以使用transaction.add 添加片段,同时拥有第一个 transaction.add(R.id.filterFram, new fragment_Search()); transaction.addToBackStack(null); 的数据 从片段二中,您可以使用 .show 而不是 replace 来显示第一个片段 并从第一个中隐藏片段二。 transaction.show(getSupportFragmentManager().findFragmentByTag("firstFragmentTag")).commit();

    【讨论】:

    • 让我先检查一下
    • 它给了我和以前一样的结果
    • 也尝试将其添加到 backstack。
    • 让我检查一下先生
    • transaction.add(R.id.filterFram, new fragment_Search()); transaction.addToBackStack(fragment_search_customerProfile.class.getName());
    【解决方案2】:

    您可以简单地保留片段的实例,因此在您的Activity 中您将拥有类似的字段。

    private Fragment fragment1;
    private Fragment fragment2;
    

    现在您可以使用性感的replace() 选项,

    添加Fragment1

    if (fragment1 == null) {
        fragment1 = new fragment_Search();
    }
    FragmentManager manager = getActivity().getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.filterFram, fragment1);
    

    Fragment2 也一样

    您可以在Fragment 本身中保存片段的状态(它检索的数据),并在您的onViewCreated() 中检查,如果状态不是null,则立即更新视图。

    class Fragment1 extends Fragment {
        private State state;
    
        public void onViewCreated(View v) {
            if (state != null) {
                // Update UI here
            }
        }
    
    }
    

    更新

    使用您自己的代码

    private Fragment fragment1; // This is a field outside of below method
    
    
    if (fragment1 == null) {
        fragment1 = new fragment_Search();
    }
    FragmentManager manager = getChildFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.filterFram, fragment1).commit();
    
    FrameLayout layout = (FrameLayout) rootView.findViewById(R.id.cpFrame);
    layout.removeAllViewsInLayout();
    

    去fragment2应该是一样的,这段代码是用来去Fragment1和Fragment2的,不管你是回去还是第一次去。

    【讨论】:

    • 我不在活动中工作,我在片段中工作。
    • 片段也应该这样,你只需要使用 getChildFragmentManager() 代替
    • 您能否将这些与我的代码一起添加到我的问题中,因为我无法理解我在哪个片段中添加了此代码。
    【解决方案3】:

    你必须添加片段而不是删除或替换

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多