【问题标题】:Android - Blank fragment when returning from backstackAndroid - 从后台堆栈返回时的空白片段
【发布时间】:2015-05-19 21:16:09
【问题描述】:

我有一个显示属性列表的视图,在屏幕底部有一个按钮可以打开一个包含 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。

我做错了什么?

【问题讨论】:

  • 在显示PropertyMapFragment 时使用((ViewGroup) getView().getParent()).getId() 有什么特别的原因吗?如果没有,我建议将其替换为 R.id.container: .replace(R.id.container, fragment, PropertyMapFragment.class.getSimpleName())
  • 是的,我这样使用它是因为我在属性片段中调用它,而不是在包含的活动中

标签: android android-fragments onbackpressed fragment-backstack


【解决方案1】:

如果您尝试从片段启动该 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 视图片段将被添加到视图/片段中,现在当您从该 Web 视图按回时,您之前的片段将可见。

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

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

希望这会有所帮助。

【讨论】:

  • 感谢您的回答@mike20132013,我尝试将replace() 更改为add(),但从未使用此方法调用onResume(),当用户返回属性片段时,我需要更新UI。
  • 没错。在这种情况下,不会调用 onResume,因为它只是在堆栈上。但是,如果您确实需要调用 onResume(),您可以使用一个活动权限托管 2 个片段并以这种方式控制 onResume 状态。这样,您也不会丢失数据。
【解决方案2】:

addToBackStack()

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多