如何获得片段不再对用户可见的确切时刻?

时间:2014-01-08 22:58:01

标签: android android-fragments

我正在尝试使用简单的信息来保存工作表。

我花了几个小时寻找解决方案,但所有这些都没有用。

我有一个活动,其布局只有一个ViewPager。该活动有两个片段(A和B)。 当第一个完成后,用户单击操作栏上的“下一个按钮”,然后应出现第二个按钮。此时,当用户完成该过程时,他点击“保存按钮”并保存工作表。

我试图以多种方式做到这一点,但没有一个有效:

现在,我试图知道片段A何时变为不可见(即,当片段B占据整个屏幕时),然后我将能够使用接口发送其数据(如解释{{3 }})。问题是我不知道使用哪种方法......

我已经尝试了所有生命周期方法,但没有一种方法有效。

有人有任何建议吗?

2 个答案:

答案 0 :(得分:0)

您可以使用ViewPager.onPageScrolled()来检测用户何时滚动ViewPager。 查看ViewPager参考文档

我修改了参考文档示例,以演示当用户滚动时将第一个片段中的信息存储到父活动中的变量中。我已经包含所有 java和xml文件,因此您应该能够剪切并粘贴到新项目中以使其运行。

<强> MainActivity.java

public class MainActivity extends FragmentActivity {

    private static final int NUM_ITEMS = 2;
    private MyAdapter mAdapter;
    private ViewPager mPager;
    private boolean mStoredCheckBoxState;
    private TextView mStoredCheckBoxStateNotification;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mStoredCheckBoxStateNotification = (TextView)findViewById(R.id.storedCheckState);
        mAdapter = new MyAdapter(getSupportFragmentManager());
        mPager = (ViewPager)findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);
        mPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int arg0) {
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                FragmentA frag = (FragmentA)mAdapter.getItem(0);

                // Store the checked state value from Fragment A 
                mStoredCheckBoxState = frag.getCheckBoxState();

                // Update the UI with the stored CheckBox state value  
                if (mStoredCheckBoxState == true) {
                    mStoredCheckBoxStateNotification.setText("Checked");
                } else {
                    mStoredCheckBoxStateNotification.setText("Not Checked");
                }
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });
    }

    public static class MyAdapter extends FragmentPagerAdapter {

        private FragmentA mFragA = new FragmentA();
        private FragmentB mFragB = new FragmentB();

        public MyAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
            case 0:
                return mFragA;
            case 1:
                return mFragB;
            }
            return null;
        }

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

<强> activity_main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Stored Checkbox State : " />

        <TextView
            android:id="@+id/storedCheckState"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Not Checked" />

    </LinearLayout>

    <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="0px"
            android:layout_weight="1">
    </android.support.v4.view.ViewPager>

</LinearLayout>

<强> FragmentA.java

public class FragmentA extends Fragment {

    private CheckBox mCheckBox;
    private boolean mCheckBoxState;

    // Getters
    public boolean getCheckBoxState() {
        return mCheckBoxState;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_a, container, false);
        mCheckBox = (CheckBox)view.findViewById(R.id.checkBox1);
        mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                mCheckBoxState = isChecked;
            }
        });
        return view;
    }
}

<强> fragment_a.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Fragment A" />

    <CheckBox
        android:id="@+id/checkBox1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="CheckBox" />

</LinearLayout>

<强> FragmentB.java

public class FragmentB extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_b, container, false);
        return view;
    }
}

<强> fragment_b.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Fragment B" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

    </LinearLayout>

</LinearLayout>

答案 1 :(得分:0)

好的,我解决了这个问题,重写方法[setUserVisibleHint(boolean)][1]并检查参数! ;)