Android - 从后台返回时的空白片段

Android - Blank fragment when returning from backstack

我有一个显示属性列表的视图,在屏幕底部有一个按钮可以打开包含 MapView 的片段。

  @Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.find_property_btn_map:

            PropertyMapFragment fragment = PropertyMapFragment.newInstance(false, null);

            getActivity().getSupportFragmentManager().beginTransaction()
                    .addToBackStack(null)
                    .replace(((ViewGroup) getView().getParent()).getId(), fragment, PropertyMapFragment.class.getSimpleName())
                    .commit();

            break;
    }
}

我的Properties片段的onCreateView方法如下

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    mRootView = inflater.inflate(R.layout.fragment_properties_list, container, false);
    getmBtnMap().setOnClickListener(this);
    getmBtnSaveSearch().setOnClickListener(this);
    getmBtnSort().setOnClickListener(this);
    getmListView().setAdapter(getPropertyAdapter());
    getmListView().setOnItemClickListener(this);
    getmListView().setOnScrollListener(this);
    getmListView().setScrollingCacheEnabled(false);

    searchProperties();

    return mRootView;
}

searchProperties(); 负责调用 Web 服务并填充 ArrayAdapter.

问题是,当我打开 MapFragment 然后按后退按钮时,我的 Property fragment 是空白的,按钮不响应 onClick 事件。

我试过调试,发现返回 Property fragment 时正在调用 onCreateView(),但是按钮不再起作用,而且 listview 也不见了。

我做错了什么?

如果您尝试从片段启动该 Web 视图,请尝试使用添加片段而不是 替换

例如:

getActivity().getSupportFragmentManager().beginTransaction()
                    .addToBackStack(null)
                    .replace(YOUR_CONTAINER_ID, fragment, PropertyMapFragment.class.getSimpleName())
                    .commit();

上面的代码是用新的片段容器替换那个片段容器,而不是在上面添加那个片段。因此,当您使用 ID 执行替换片段时,它只会用新视图替换该视图。

现在,

相同的代码,但添加了:

getActivity().getSupportFragmentManager().beginTransaction()
                        .addToBackStack(null)
                        .add(YOUR_CONTAINER_ID, fragment, PropertyMapFragment.class.getSimpleName())
                        .commit();

现在,您拥有的那个 Web 视图片段将被添加到 view/fragment,现在当您从该 Web 视图按回时,您之前的片段将可见。

只需确保您要替换的 ID 与您拥有所有其他属性的 ID 相同。

也许我误解了这个问题,所以请在那个上下文中纠正我。

希望对您有所帮助。

addToBackStack() <--不要将此包含在您的第一个片段中。-->

if(getSupportFragmentManager().getBackStackEntryCount() !=1){
                fragmentTransaction.addToBackStack(null);
            }