代码之家  ›  专栏  ›  技术社区  ›  Siriann

在片段之间发送数据

  •  0
  • Siriann  · 技术社区  · 6 年前

    我使用本教程学习了如何在片段之间传递数据:

    https://www.journaldev.com/14207/android-passing-data-between-fragments

    如果我有两个碎片的话,效果会很好。但是我的应用程序需要更多的片段。片段是表格布局上的选项卡。当我在相邻的两个标签之间来回切换时,这很好。但只要我从tab0切换到更远的选项卡(tab5),发送消息,然后在tab0上检查它,EditText就会返回它的原始值。

    更改EditText的值时,会更改选项卡标题的值。并且它会正确更新(我从tab0转到tab5,发送消息,tab0的标题更改,因此消息被接收。)但当我返回到tab0时,它会更改回原始值(也是tab标题,但这是正确的工作方式)。

    在里面 STab.java (选项卡的代码):

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    
        try {
            SD = (SendData) getActivity();
        } catch (ClassCastException e) {
            throw new ClassCastException("Error in retrieving data. Please try again");
        }
    }
    interface SendData {
        void setStructureBonusTileSpinner(int position, int currentTabNumber);
    }
    
    protected void setStructureBonusTileSpinner(int position){
        spinnerStructureBonusTile.setSelection(position);
    }
    

    也在 ,在onViewCreated方法中:

    spinnerStructureBonusTile.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
                SD.setStructureBonusTileSpinner(spinnerStructureBonusTile.getSelectedItemPosition(), tabNumber);
            }
        });
    

    在里面 MainActivity.java 实现哪一个 STab.SendData :

    @Override
    public void setStructureBonusTileSpinner(int position, int currentTabNumber) {
    
        for(int i = 0; i < mSectionsPagerAdapter.getCount(); i++){
    
            if(i != currentTabNumber) {
                String tag = "android:switcher:" + R.id.container + ":" + i;
                STab f = (STab) getSupportFragmentManager().findFragmentByTag(tag);
                if(f != null){
                    f.setStructureBonusTileSpinner(position);
                }
            }
    
        }
    
    }
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   JMedinilla    6 年前

    默认情况下,屏幕外页面限制设置为1,因此将从适配器重新创建那些超出相邻两个页面的片段,您说它们可以工作。

    mViewPager.setOffScreenPageLimit(fragmentCount - 1)
    

    PD2:你也应该发布相关代码

        2
  •  1
  •   eltoryn7    6 年前

    如果您将数据从片段A传输到片段B,请执行以下操作。

    1.片段A->基本活动->片段B(不推荐) 2.使用Bundle对象。

    public static Fragment newInstance(String param1, String param2) {
        BlankFragment fragment = new BlankFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }