用户“刷出”viewpager片段时运行代码?

时间:2014-03-04 22:21:11

标签: java android fragment

我需要检测用户何时从我的一个片段中滑入和滑出,我尝试onPause但是当滑动到相邻屏幕时它似乎没有暂停(当它移动两个sereens时它被破坏)。如果可能的话,我想从片段本身做到这一点,因为我正在动态地更改片段,而某些代码仅在存在某个片段时才有用。

有可能这样做吗?如何检测滑动“out”(如果可能,从片段本身)?


编辑:

我尝试在Fragment上使用setUserVisibleHint,这似乎是最好的方法,但它永远不会被调用。我正在使用API​​级别19,我不确定缺少什么:

import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;


public class Contacts extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            View view = inflater.inflate(R.layout.fragment_screen_contacts, container, false);
            return view;
        }


    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        Log.d("MyFragment", "This never shows up.");
        Toast.makeText(getActivity(), "Neither does this", Toast.LENGTH_LONG).show();
    }
}

3 个答案:

答案 0 :(得分:5)

您可以使用ViewPager#setOnPageChangeListener()

viewPager.setOnPageChangeListener(new OnPageChangeListener() {

        ...

        @Override
        public void onPageSelected(int position) {
            // do what you want here, for example
            if (position != 3) {
                ...
            }
        }

});

修改

如果您希望逻辑在Fragments本身内部,这里有一种方法:向您的子类添加方法onFragmentExited()或其他东西。把逻辑放在那里。然后,在OnPageChangeListener中,调用该方法。例如:

viewPager.setOnPageChangeListener(new OnPageChangeListener() {

     int lastPosition;
     @Override
     public void onPageSelected(int position) {
            MyInterface fragment = (MyInterface)mPagerAdapter.instantiateItem(viewPager, lastPosition);
            if (fragment != null) {
                fragment.onFragmentExited();
            }
            /* If you want to notify the fragment being focused
            fragment = (MiniApp)mPagerAdapter.instantiateItem(viewPager, position);
            if (fragment != null) {
                fragment.onFragmentEntered();
            } */
            lastPosition = position;
     }                      
});

adapter.getFragment(position)取决于您用于存储片段的任何适配器/结构。

答案 1 :(得分:0)

如果您对片段生命周期结束的更多案例感兴趣,不仅可以将其刷出来,还可以使用以下答案:How to determine when Fragment becomes visible in ViewPager

答案 2 :(得分:0)

正如已经说明并在喜欢的答案中测试过的,你不知道哪个片段已经消失了,但是只需要一些Java,就可以准确地知道哪个片段是新片段(以及它在你的适配器中的位置。如果您存储“最后一个可见片段位置”,您可以将其与新位置进行比较,并确定当前可见的最后一个(用户可以向左或向右滑动!)。

Java Secret ...是定义一个接口,使用你的适配器的getItemAt(pos),在ViewPager上使用OnPageChangeListener()并将这三者结合起来。同时让你的Fragments实现接口,这样你就可以使用ViewPagerAdatper获取Fragment并调用(yourInterface).youHaveBeenHidden();

如果你想知道什么时候扫描页面,你将不得不使用页面更改监听器的onPageScrolled(int position, float positionOffset, int positionOffsetPixels)方法并在那里进行数学计算(请记住,这将被称为非常重要)用户滚动,因为你得到一个像素的偏移量,正如你可以想象的那样快速增长。)

更新您是否尝试过...

public void onHiddenChanged (boolean hidden)

Added in API level 11
Called when the hidden state (as returned by isHidden() of the fragment has changed. Fragments start out not hidden; this will be called whenever the fragment changes state from that.

Parameters
hidden  True if the fragment is now hidden, false if it is not visible.

更新2 我就是这样做的:

public interface ViewPagerFragmentInterface {
    void onFragmentBecameVisible();
}

我的碎片:

public class SomeViewPagerFragment extends Fragment implements ViewPagerFragmentInterface {
      public void onFragmentBecameVisible() {
          // I AM VISIBLE!
      }
}

然后在我的ViewPage onPageChangeListener() ...

public void onPageSelected(final int i) {
ViewPagerFragmentInterface fragment =
       (ViewPagerFragmentInterface)mPagerAdapter.instantiateItem(mViewPager, i);
    if (fragment != null) {
       fragment.onFragmentBecameVisible();
    }
}