java - FragmentStatePageAdapter 保留附加到 fragment 的接口(interface)

标签 java android android-fragments android-viewpager fragmentstatepageradapter

我正在使用 FragmentStatePagerAdapter (用于 ViewPager),附加到 ViewPager 的 fragment 具有我希望的字段将数据传递回 Activity 。我的问题在于,一旦设备旋转,我传递给 fragment 的界面对象就会丢失。

我的问题是如何保留界面对象。
现在是必需的代码 fragment :

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;
            }
        });
    }
}

fragment :

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);
    }
}

最佳答案

我认为你应该重新阅读这篇文章https://developer.android.com/training/basics/fragments/communicating.html .

让 Activity 实现接口(interface)并使用 onAttach() onDetach() 方法重置回调对 Activity 的引用。

如果您尝试保留 fragment 的状态(setRetainInstance(true)、onsaveInstanceState())(其中包括接口(interface)对象),您的代码可能会遇到内存泄漏问题,或者您的代码会无缘无故地变得过于复杂。

关于java - FragmentStatePageAdapter 保留附加到 fragment 的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39307891/

相关文章:

java - 使用相同的条件编辑 Mysql 表

Java 相当于 NetworkCredential

android - 如何测试 fragment View 是否对用户可见?

java - 无法在 fragment 中使用 MyActivity.this 吗?

java - android代码中的long和Long有什么区别?

Java JNDI 内部结构

Android:什么是Proguard和ProGuard映射

Android:是否可以从第二个 Activity 中引用一个 Activity ?

android - API14 中的新 Property 类比内部 getter/setter 有何优势?

android - 当 AppTheme 为半透明时,软键盘与 EditTextPreferenceDialogFragmentCompat 重叠