我写了一个在两个片段之间切换的虚拟活动.当您从FragmentA转到FragmentB时,FragmentA会被添加到后台堆栈中.但是,当我返回FragmentA(通过按回)时,会创建一个全新的FragmentA,并且它所处的状态将丢失.我感觉我跟这个问题一样,但我已经包含了一个完整的代码示例来帮助解决问题:
public class FooActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(android.R.id.content, new FragmentA());
transaction.commit();
}
public void nextFragment() {
final FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(android.R.id.content, new FragmentB());
transaction.addToBackStack(null);
transaction.commit();
}
public static class FragmentA extends Fragment {
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View main = inflater.inflate(R.layout.main, container, false);
main.findViewById(R.id.next_fragment_button).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
((FooActivity) getActivity()).nextFragment();
}
});
return main;
} …Run Code Online (Sandbox Code Playgroud) 我在屏幕上有应用程序标题片段和内容片段.当用户点击titles片段中的项目时,将创建相应片段并将其插入到帧中,并且所选标题将在titles片段中突出显示.
事务已完成fragment.addToBackStack(),因此当用户单击该BACK键时,将恢复先前的片段并将其插入帧中.
当事务管理器恢复片段时,恢复视图状态的最佳解决方案是什么?
问题是我应该突出标题片段中的先前片段名称,我应该知道它是什么片段.我通过在我自己的堆栈中存储视图状态来解决它:创建片段并使用事务管理器侦听器在更改事务backstack时恢复.
但这似乎不是正确的解决方案.
我最近开始在FragmentActivity中的标签主机内部开发一个带有片段的应用程序.由于TabActivity类现已弃用,因此Android文档说这样做.为了使用片段,我使用的是android v4支持库.
目前我的应用程序包含一个选项卡,其中存在片段.要导航到选项卡中的新片段,我一直在使用以下代码(根据文档似乎是正确的):
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(containerId, newFragment);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
一切顺利,直到我按下后退键导航到前一个片段并意识到我的所有视图状态几乎都被破坏了......发生的事情是onCreateView()方法在我之前的片段上再次被调用即使之前已经创建了它的观点......为什么会这样?我已经四处搜索了如何使用片段正确维护状态,但我似乎无法在此找到合适的文档.
然后我尝试使用的是
ft.add(containerId, newFragment);
Run Code Online (Sandbox Code Playgroud)
代替
ft.replace(containerId, newFragment);
Run Code Online (Sandbox Code Playgroud)
这实际上工作得很好,因为我的视图状态被保留了 - 每次显示我之前的片段时都没有调用onCreateView().然而,我接着注意到的是,我可以与位于当前片段下方的先前片段的组件(按钮等)进行交互,即使我看不到组件!?我在某处读到应该使用以下方法来保存一些状态:
public void onSaveInstanceState (Bundle outState)
Run Code Online (Sandbox Code Playgroud)
我实现了这个方法,但它从未被调用过!我还注意到,过去onCreateView()和onActivityCreated()方法的bundle总是为null.谷歌肯定没有这么难以实现这样的事情,我必须遗漏一些东西?任何有关如何正确维护片段视图状态的帮助将不胜感激!
谢谢.