Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何附加()和分离()而不是添加()和删除()以保存片段视图_Java_Android_Android Actionbar_Savestate - Fatal编程技术网

Java 如何附加()和分离()而不是添加()和删除()以保存片段视图

Java 如何附加()和分离()而不是添加()和删除()以保存片段视图,java,android,android-actionbar,savestate,Java,Android,Android Actionbar,Savestate,我为ActionBar提供了以下代码: private class MyTabListener implements ActionBar.TabListener { private Fragment mFragment; private final Activity mActivity; private final String mFrag; public MyTabListener( Activity activity, String fragName )

我为
ActionBar
提供了以下代码:

private class MyTabListener implements ActionBar.TabListener
{
    private Fragment mFragment;
    private final Activity mActivity;
    private final String mFrag;

    public MyTabListener( Activity activity, String fragName )
    {
        mActivity = activity;
        mFrag = fragName;
    }

    @Override
    public void onTabReselected( Tab tab, FragmentTransaction ft )
    {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabSelected( Tab tab, FragmentTransaction ft )
    {
        mFragment = Fragment.instantiate( mActivity, mFrag );
        ft.add( android.R.id.content, mFragment );
    }

    @Override
    public void onTabUnselected( Tab tab, FragmentTransaction ft )
    {
        ft.remove( mFragment );
        mFragment = null;
    }
}
我在那些
选项卡中有一些文本框,在这些选项卡之间切换会使应用程序丢失我添加到这些文本框中的所有数据。我想使用保存片段状态的
attach
detach
而不是
add
remove

如何在我已有的代码中实现这一点

更新

代码现在如下所示:

private class MyTabListener implements ActionBar.TabListener
{
    private Fragment mFragment;
    private final Activity mActivity;
    private final String mFrag;

    public MyTabListener( Activity activity, String fragName )
    {
        mActivity = activity;
        mFrag = fragName;
    }

    @Override
    public void onTabReselected( Tab tab, FragmentTransaction ft )
    {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabSelected( Tab tab, FragmentTransaction ft )
    {
        //mFragment = Fragment.instantiate( mActivity, mFrag );
        //ft.add( android.R.id.content, mFragment );
          mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mFrag);
          if( mFragment == null ) {
            mFragment = Fragment.instantiate(mActivity, mClass.getName());
            ft.add(android.R.id.content, mFragment, mFrag);
          } else {
            ft.attach(mFragment);
          }
    }

    @Override
    public void onTabUnselected( Tab tab, FragmentTransaction ft )
    {
        //ft.remove( mFragment );
        //mFragment = null;
          if (mFragment != null) {
                ft.detach(mFragment); 
              }
    }
}
下面这一行有一个错误:

mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mFrag);
错误:

The method getSupportFragmentManager() is undefined for the type Activity

您可以使用
SharedReferences
临时存储正在显示的变量,而不是重写代码

在要离开的选项卡的
ondestory
方法中,只需将变量添加到首选项中,并在重新进入选项卡时检索它们

@Override
public void onDestroy(){
    super.onDestroy();
    Log.i("OnDestroy", "Logged");
    SharedPreferences prefs = getActivity().getSharedPreferences("name", Context.MODE_PRIVATE); 
    Editor editor = prefs.edit();
    editor.putString("stringName", stringToStore);
    editor.commit();
}

我在这里给出的解决方案与中的完全相同。区别是什么?我只是在插入您的代码和预定义代码之间的变量时遇到了一点小麻烦:/您让它工作了吗?我认为您在这里缺少的关键组件是在执行
ft.add(viewID,fragment,tag)
时的标记。我可以保持代码不变并添加标记吗?标签是什么?在这种情况下,标签是
mFrag
。初始化TablListener时,您发送
公共MyTablListener(活动,字符串fragName)
并设置
mFrag=fragName
。您需要使用此标记来检索片段。