我需要检测用户何时从我的一个片段中滑入和滑出,我尝试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();
}
}
答案 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();
}
}