片段setuserVisibleHint为true但getActivity返回null

问题描述 投票:6回答:4

我一直在片段的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
    }
android fragment android-support-library
4个回答
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
    }
}

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
投票

根据Google的说法:“在Android N之前,有一个平台错误可能会导致setUserVisibleHint在FragmentTransaction提交之前将片段提升到已启动状态。由于某些应用程序依赖于此行为,因此会为声明为targetSdkVersion为23或更低。“

因此,有两种选择:1。使用targetSdkVersion <24重建; 2.根据新情况修改app =>分别在onAttach方法或更高版本的片段生命周期中使用此回调外的上下文;


1
投票
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser && (getActivity()!=null)) {
     getActivity();
    }
}

在第一个午餐时,getActivity()是Nullable

© www.soinside.com 2019 - 2024. All rights reserved.