Android - 从Backstack返回时的空白片段

时间:2015-05-19 21:16:10

标签: android android-fragments onbackpressed fragment-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个事件。

我尝试调试并看到onCreateView()在回到Property fragment时被调用,但按钮不再有效且listview无处可见。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

例如:

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视图片段将添加到视图/片段中,现在当您从该Web视图中按回时,您可以看到之前的片段。

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

也许我误解了这个问题所以请在这种情况下纠正我。

希望这有帮助。

答案 1 :(得分:0)

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

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