我一直在片段的setUserVisibleHint()
方法中做一些逻辑。我一直在检查isVisibleToUser
是否为真,然后使用getActivity
返回活动。这一点运行良好(100%的时间),直到我将支持库更新为最新版本(support:appcompat-v7:24.2.0
)。现在getActivity
总是返回null。解释此行为的支持库是否有一些更改?
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(false);
if (isVisibleToUser) {
getActivity() <- null
}
答案 0 :(得分:3)
我参加派对有点晚了但也许这可以帮助别人。我通过在fragment类中创建一个布尔成员来解决这个问题。然后我使用它来确定我是否能够在setUserVisibleHint方法中成功获取活动。如果没有,我在onAttach中执行与活动相关的代码。见下文。
public MyFragment extends Fragment {
...
private boolean doInOnAttach = false;
@Override
public void setUserVisibleHint(boolean visible) {
super.setUserVisibleHint(visible);
// if the fragment is visible
if (true == visible) {
// ... but the activity has not yet been initialized
doInOnAttach = true;
} else {
myAction();
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (true == doInOnAttach) {
myAction();
doInOnAttach = false;
}
}
private void myAction() {
// code to execute here
}
}
答案 1 :(得分:2)
以下为我工作....
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
//// create class member variable to store view
viewFrag =inflater.inflate(R.layout.fragment_main_favorite, container, false);
// Inflate the layout for this fragment
return viewFrag;
}
并使用此
@Override
public void setUserVisibleHint(boolean visible)
{
super.setUserVisibleHint(visible);
if (visible)
{
View v = viewFrag ;
if (v == null) {
Toast.makeText(getActivity(), "ERROR ", Toast.LENGTH_LONG ).show();
return;
}
}
}
答案 2 :(得分:2)
根据Google的说法:“在Android N之前,有一个平台错误可能会导致setUserVisibleHint在FragmentTransaction提交之前将片段提升到已启动状态。由于某些应用程序依赖于此行为,因此会保留应用程序声明targetSdkVersion为23或更低。“
所以,有两种选择: 1.使用targetSdkVersion&lt;重建24; 2.根据新情况修改应用程序=&gt;分别在onAttach方法或稍后的片段生命周期中使用此回调之外的上下文;
答案 3 :(得分:1)
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && (getActivity()!=null)) {
getActivity();
}
}
第一次午餐时getActivity()是Nullable