片段setuserVisibleHint为true但getActivity返回null

时间:2016-09-16 09:20:52

标签: android fragment android-support-library

我一直在片段的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
    }

4 个答案:

答案 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