【问题标题】:How to attach() and detach() instead of add() and remove() to save fragment view如何使用 attach() 和 detach() 而不是 add() 和 remove() 来保存片段视图
【发布时间】:2013-07-31 13:52:28
【问题描述】:

我有以下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;
    }
}

我在这些 Tab 片段中有一些文本框,并且在选项卡之间切换会迫使应用丢失我添加到这些文本框中的所有数据。而不是addremove,我想使用attachdetach 来保存片段状态。

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

更新

现在的代码如下所示:

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

【问题讨论】:

  • 我在这里给出的解决方案与stackoverflow.com/questions/16634247/… 完全相同。有什么区别?
  • 我只是在插入您的代码和我的预定义代码之间的变量时遇到了一点麻烦:/
  • 你让它工作了吗?我认为您在这里缺少的关键组件是您执行ft.add(viewID,fragment,TAG) 时的标签
  • 我可以保留我的代码并添加标签吗? TAG 是什么?
  • 在这种情况下,标签是mFrag。初始化 TabListener 时,发送 public MyTabListener( Activity activity, String fragName ) 并设置 mFrag = fragName。您需要使用此标签来检索片段。

标签: java android android-actionbar savestate


【解决方案1】:

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

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

@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();
}

【讨论】:

    猜你喜欢
    • 2012-08-22
    • 2014-12-18
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 2011-04-07
    • 1970-01-01
    相关资源
    最近更新 更多