维护片段的视图状态
我看过这个问题的Link1,但可以理解它的正确性。我有一个加载列表的片段。当我点击列表项时,它会打开另一个活动。但我按回来按钮它再次加载列表。我希望它处于之前的相同位置。在上面提到的链接中,它指定使用标志,但我没有明白。维护片段的视图状态
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dashboard);
android.app.Fragment fragment = new MeFragment();
getFragmentManager().beginTransaction().replace(R.id.layout_FragmentsContainer, fragment).addToBackStack(null).commit();
}
}
public class MeFragment extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.inflate(R.layout.fragment_me, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
meLV = (ListView) getView().findViewById(R.id.lv_Inbox);
loadingListProgress = (ProgressBar) getView().findViewById(R.id.progress_LoadingList);
meList = new ArrayList<Message>();
meAdapter = new MessagesListAdapter(getActivity(), meList);
//addFooter();
meLV.setAdapter(meAdapter);
meLV.setOnItemClickListener(this);
pageCount = 0;
loadmoreProgressDialog = new ProgressDialog(getActivity());
loadmoreProgressDialog.setTitle("Please wait ...");
loadmoreProgressDialog.setMessage("Loading more ...");
loadmoreProgressDialog.setCancelable(true);
loadUserMessages();
meLV.setOnScrollListener(new EndlessScrollListener() {
@Override
public void onLoadMore(int page, int totalItemsCount) {
// TODO Auto-generated method stub
//addFooter();
loadmoreProgressDialog.show();
loadUserMessages();
}
});
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// TODO Auto-generated method stub
Utils.showToast_msg(getActivity(), "MessageItemClicked");
ReferralDetailFragment fragment = new ReferralDetailFragment();
getFragmentManager().beginTransaction().replace(R.id.layout_FragmentsContainer, fragment).addToBackStack(null).commit();
}
}
public class ReferralDetailFragment extends Fragment implements OnClickListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_referraldetail,container, false);
linkToAcknowledge = (TextView) view.findViewById(R.id.lbl_Link_to_Acknowledge);
return view;
}
}
你试图实现的可能是在savedInstanceState
的帮助下完成的。我也有这样的问题,我通过使用add()
方法而不是replace()
在转换中解决。 如果你可以改变你的方法或已经不使用add()
比给它一个镜头。 如果add()
方法没有办法,那么检查savedInstanceState
的实现。
根据我们的意见交换,我完全deletde我的答案,重新写一个新的。
我复制/粘贴我的一个应用程序的代码,并删除无用的东西,并更改名称。希望没有太多的输入错误,因为它是使其工作的最低要求。
当我从SecondFragment弹出到FirstFragment时,FirstFragment的滚动位置与单击加载SecondFragment的项目时的滚动位置相同。
请注意,我不会延伸FragmentActivity
。我有一个加载碎片的活动。
根据您的需要进行延伸/修改。
MainActivity:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
}
}
FirstFragment类:
public class FirstFragment extends Fragment implements OnItemClickListener {
private ListView mListView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.first_fragment_layout, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mListView = (ListView) getView().findViewById(R.id.listview_first_fragment);
mListView.setAdapter(mAdapter); // depends on your adapter
mListView.setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mListView.setItemChecked(position, true);
//in case you need, set the bundle here, for example pass the position
Bundle arguments = new Bundle();
arguments.putInt("position", position);
SecondFragment secondFragment = new SecondFragment();
secondFragment.setArguments(arguments);
getFragmentManager().beginTransaction().replace(R.id.fragment_container, secondFragment).addToBackStack(null).commit();
}
}
SecondFragment类:
public class SecondFragment extends Fragment {
private Integer mPosition;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.second_fragment_layout, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Bundle arguments = getArguments();
if (arguments == null) {
mPosition= 0;
} else {
mPosition= arguments.getInt("Position");
}
}
}
我实现了这一个简单的解决方案在我的应用程序,基本上当你按下回再次去片段,onCreateView()被调用。在这里,在onCreateView()已完成所有的初始化,所以我们改变
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_me, container, false);
/*
*Whatever you want to do
*
*/
return view;
}
到:
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
if(view==null){
view = inflater.inflate(R.layout.fragment_me, container, false);
/*
*Whatever you want to do
*
*/
}
else{
((ViewGroup)view.getParent()).removeView(view);
}
return view;
}
在这里,我们向外移动的查看视图,并使其成为类变量。所以如果这是片段第一次被调用,它是空的,并且初始化发生,否则它会变成黑色。否则,因为onCreateView()
会将其作为视图父级的子项添加回来,所以因为视图已经存在,所以我们将其删除,并且onCreateView
会自动再次添加它。
让我彻底解释。我正在加载一个fragmentA(它从web加载一个列表)到一个Activity中。而当用户点击列表项时,它会加载另一个fragmentB在相同的活动中的fragmentA的地方 –
是的,这就是我需要的。你可以请你发布代码片段,你是如何做到的? –
我已经编辑了所有完整的代码的帖子,你可以请看看,看看有什么不对吗 –