2014-07-15 72 views
1

我看过这个问题的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; 
    } 
} 
+0

让我彻底解释。我正在加载一个fragmentA(它从web加载一个列表)到一个Activity中。而当用户点击列表项时,它会加载另一个fragmentB在相同的活动中的fragmentA的地方 –

+0

是的,这就是我需要的。你可以请你发布代码片段,你是如何做到的? –

+0

我已经编辑了所有完整的代码的帖子,你可以请看看,看看有什么不对吗 –

回答

0

你试图实现的可能是在savedInstanceState的帮助下完成的。我也有这样的问题,我通过使用add()方法而不是replace()在转换中解决。 如果你可以改变你的方法或已经不使用add()比给它一个镜头。 如果add()方法没有办法,那么检查savedInstanceState的实现。

  1. correctly save instance state.

  2. How to save states of fragment views.

1

根据我们的意见交换,我完全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"); 
     } 
    } 
} 
1

我实现了这一个简单的解决方案在我的应用程序,基本上当你按下回再次去片段,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会自动再次添加它。