简体   繁体   English

FragmentStatePageAdapter保留到片段的接口

[英]FragmentStatePageAdapter Retaining interface attached to fragment

I'm using a FragmentStatePagerAdapter (for the ViewPager ), The fragments which are attached to the ViewPager have fields which I wish to pass the data back to the Activity. 我正在使用FragmentStatePagerAdapter (用于ViewPager ),附加到ViewPager的片段具有一些字段,希望将数据传递回Activity。 My problem lies in that the interface objects which I pass to the fragments are lost once the device has been rotated. 我的问题在于,一旦旋转设备,传递给片段的接口对象就会丢失。

My question is how do I retain the interface objects. 我的问题是如何保留接口对象。
Now the obligatory code snippets: 现在,强制性代码片段:

The Activity: 活动:

public class TheActivity extends AppCompatActivity {

    static final int PageCount = 2;
    static final int PageA = 0;
    static final int PageB = 1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(new FragmentStatePagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {

                switch (position) {
                    case PageA: {
                        PageAFragment fragment = PageAFragment.CreateFragment();
                        fragment.setDataListener(new PageAFragment.DataListener() {
                            @Override
                            public void OnPageADataChange(String value) {
                                PageAData = value;
                            }
                        });
                        return fragment;
                    }
                    case PageB: {
                        PageBFragment fragment = PageBFragment.CreateFragment(2);
                        fragment.setDataListener(new PageBFragment.DataListener() {
                            @Override
                            public void OnPageAOneDataChange(String value) {
                                PageBDataOne = value;
                            }

                            @Override
                            public void OnPageATwoDataChange(String value) {
                                PageBDataTwo = value;
                            }
                        });
                        return fragment;
                    }
                }

                return null;
            }

            @Override
            public int getCount() {
                return PageCount;
            }
        });
    }
}

The Fragments: 片段:

public class PageAFragment extends Fragment {

    private DataListener mListener;

    public static PageAFragment CreateFragment() {
        return new PageAFragment();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.page_a, container, false);
        EditText editText = (EditText) view.findViewById(R.id.edittext_data_a);
        editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionID, KeyEvent event) {

                if (actionID == EditorInfo.IME_ACTION_DONE)
                    mListener.OnPageADataChange(editText.getText().toString());
                return false;
            }
        });
        return view;
    }

    public void setDataListener(DataListener dataListener) {
        mListener = dataListener;
    }

    public interface DataListener {
        void OnPageADataChange(String value);
    }
}


public class PageBFragment extends Fragment {

    private DataListener mListener;

    public static PageBFragment CreateFragment(int data) {
        PageBFragment fragment = new PageBFragment();
        Bundle bundle = new Bundle();
        bundle.putInt("Data", data);
        fragment.setArguments(bundle);
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.page_b, container, false);
        EditText editTextOne = (EditText) view.findViewById(R.id.edittext_data_b_one);
        editTextOne.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionID, KeyEvent event) {
                if (actionID == EditorInfo.IME_ACTION_DONE)
                    mListener.OnPageAOneDataChange(editTextOne.getText().toString());
                return false;
            }
        });
        EditText editTextTwo = (EditText) view.findViewById(R.id.edittext_data_b_two);
        editTextTwo.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionID, KeyEvent event) {
                if (actionID == EditorInfo.IME_ACTION_DONE)
                    mListener.OnPageATwoDataChange(editTextTwo.getText().toString());
                return false;
            }
        });
        return view;
    }

    public void setDataListener(DataListener dataListener) {
        mListener = dataListener;
    }

    public interface DataListener {
        void OnPageAOneDataChange(String value);

        void OnPageATwoDataChange(String value);
    }
}

I think you should re read this https://developer.android.com/training/basics/fragments/communicating.html . 我认为您应该重新阅读https://developer.android.com/training/basics/fragments/communicating.html

Let the activity implement the interfaces and use the onAttach() onDetach() methods to reset the reference of the callback to the activity. 让活动实现接口,并使用onAttach()onDetach()方法重置对活动的回调引用。

With your code if you try to retain the fragments' state (setRetainInstance(true), onsaveInstanceState()) which includes the interface objects you will probably have issues with memory leak or your code will become too complicated for no reason. 对于您的代码,如果您尝试保留包括接口对象在内的片段状态(setRetainInstance(true),onsaveInstanceState()),则可能会出现内存泄漏问题,或者您的代码无缘无故变得太复杂。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM