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