问题
A message needs to be displayed to the user when a fragment in a ViewPager becomes visible. Currently the call is:
// Within a class that extends Fragment
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
MessageUtility.displayMessage(getContext());
}
}
MessageUtility.displayMessage()
opens an alert dialog with a message.
Context
is required to display the message. However, the fragment is not guaranteed to be attached by the time setUserVisibleHint()
is called. Thus, the Context
will be null
, even though isVisiableToUser == true
.
Checking isVisibleToUser && isAttached()
works in theory, but setUserVisibleHint()
is not provoked after isAttached() == true
.
Is there some way to allow the call to displayMessage()
to wait until the Fragment
is attached?
回答1:
Better late than never ,I have a little hackish solution ,call setUserVisibleHint()
from onActivityCreated()
method.
private boolean myIsVisibleToUser;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
myIsVisibleToUser=isVisibleToUser;
if (isVisibleToUser && getActivity()!=null) {
MessageUtility.displayMessage(getContext());
}
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setUserVisibleHint(myIsVisibleToUser);
}
回答2:
It's a bit different approach but more effective solution. Add a new OnPageChangeListenr
to your ViewPager
.
yourPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i2) {
}
@Override
public void onPageSelected(int i) {
// Check if i == your fragment's position and display message
MessageUtility.displayMessage(getContext());
}
@Override
public void onPageScrollStateChanged(int i) {
}
});
来源:https://stackoverflow.com/questions/39105725/null-context-in-setuservisiblehint