2016-06-21 100 views
0

将我的savedInstanceState写入了我的片段。片段中的savedInstanceState不起作用

保存实例不起作用。当我切换回“HomeMenu”时,所有字段消失。

在我的活动:

private void selectItemFromDrawer(int position) { 
    FragmentManager fragmentManager = getFragmentManager(); 

    Fragment fragment = null; 
    String tagFrag = "default"; 
    switch (mNavItems.get(position).mTitle) { 

     case R.string.menu_home: 
      fragment = fragmentManager.findFragmentByTag("menu_home"); 

      if(fragment == null) { 
       fragment = new HomeMenuFragment(); 
      } else { 
       Toast.makeText(customActivity.this, "already Exists", Toast.LENGTH_SHORT).show(); 
      } 
      tagFrag = "menu_home"; 
      break; 
     case R.string.menu_pref: 
      fragment = fragmentManager.findFragmentByTag("menu_pref"); 
      if(fragment == null) 
       fragment = new PreferencesFragment(); 

      tagFrag = "menu_pref"; 
      break; 
    } 
    if(fragment != null) { 
     fragmentManager.beginTransaction() 
       .replace(R.id.mainContent, fragment, tagFrag) 
       .commit(); 
    } 
} 

这就是工程..片段改变正常..

敬酒只能如果该片段ACTIVE ..但如果我切换回给他。

例如:

  1. 首页=>首页=> “烤面包出现”
  2. 首页=>县=>首页=> “否吐司”。

进入我的HomeMenuFragment我用这个代码:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.activity_main, container, false); 
} 


@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    if (savedInstanceState != null) { 
     strUser = savedInstanceState.getString("strUser", ""); 
     strName = savedInstanceState.getString("strName", ""); 
     strDesc = savedInstanceState.getString("strDesc", ""); 

     if(((TextView) getActivity().findViewById(R.id.user))!=null) 
      ((TextView) getActivity().findViewById(R.id.user)).setText(strUser); 

     if(((TextView) getActivity().findViewById(R.id.name))!=null) 
      ((TextView) getActivity().findViewById(R.id.name)).setText(strName); 
     if(((TextView) getActivity().findViewById(R.id.desc))!=null) 
      ((TextView) getActivity().findViewById(R.id.desc)).setText(strDesc); 

    } 
} 
@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString("strUser", ((TextView) getActivity().findViewById(R.id.user)).getText().toString()); 
    outState.putString("strName", ((TextView) getActivity().findViewById(R.id.name)).getText().toString()); 
    outState.putString("strDesc", ((TextView) getActivity().findViewById(R.id.desc)).getText().toString()); 
} 

回答

-1

这可能是你叫super.onSaveInstanceState(outState)你把你希望保存字符串之前。为了解决这个问题,你只需要调用super.onSaveInstanceState(outState)AFTER把你希望保存的值。以下是您需要做出的更改:

@Override 
public void onSaveInstanceState(Bundle outState) {  
    outState.putString("strUser", ((TextView) getActivity().findViewById(R.id.user)).getText().toString()); 
    outState.putString("strName", ((TextView) getActivity().findViewById(R.id.name)).getText().toString()); 
    outState.putString("strDesc", ((TextView) getActivity().findViewById(R.id.desc)).getText().toString()); 
    //moved it here 
    super.onSaveInstanceState(outState); 
} 

我希望这可以解决您的问题。试试看,让我知道。

+0

不起作用:-s对不起 –

+0

这是否意味着'savedInstanceState'仍然是空或究竟是怎么回事? – ishmaelMakitla

+0

我认为onSave从未被称为.. –

0

好吧,我会试着解释一下,这并不容易。

在这种情况下,您的片段不会被销毁,只有其中的视图才会被销毁。 因此,您使用的每个视图都必须实现状态保存/恢复。

我给你留下了更好的解释,希望对你有所帮助! https://inthecheesefactory.com/blog/fragment-state-saving-best-practices/en

更新

尝试使用newIstance创建片段,这是为了避免参数的丢失的最佳做法。 例如:

public static MyFragment newInstance(String user, String name, String desc) { 
    MyFragment mFragment = new MyFragment(); 

    Bundle args = new Bundle(); 
    args.putString("user", user); 
    args.putString("name", name); 
    args.putString("desc", desc); 
    mFragment.setArguments(args); 

    return mFragment; 
} 

而在片段onCreate()您可以通过使用访问数据:

String strUser = getArguments().getString("user", ""); 

如果该片段由Android重建,束将可用。 请记住,setArguments只能在Fragment附加到Activity之前调用。

让我知道!

+0

不起作用:-s对不起 –

+0

你检查我的更新吗? –

0

根据Bundle文档,没有putString()getString()方法,您需要使用putStringArrayList (String key, ArrayList<String> value)。我还建议你避免在getActivity()。findViewById()上调用这么多的调用,众所周知它会导致很多开销。另外,为什么你从片段内的活动获取视图值?看起来像重复的代码。不管怎样,试试这个:

TextView tvUser, tvName, tvDesc; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    // Store TextView references calling findViewById only once 
    tvUser = ((TextView) getActivity().findViewById(R.id.user)); 
    tvName = ((TextView) getActivity().findViewById(R.id.user)); 
    tvDesc = ((TextView) getActivity().findViewById(R.id.user)); 
} 


@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    if (savedInstanceState != null) { 
     ArrayList al = new ArrayList(); 
     al = savedInstanceState.getStringArrayList("args"); 
     tvUser.setText(al.get(0)); 
     tvName.setText(al.get(1)); 
     tvDesc.setText(al.get(2)); 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    ArrayList al = new ArrayList(); 
    al.add(0, tvUser.getText()); 
    al.add(1, tvName.getText()); 
    al.add(2, tvDesc.getText()); 
    outState.putStringArrayList("args", al); 
} 
+0

感谢您的帮助。它没有工作。 它有一点帮助。只有当我回到家时,我才坚持不懈......如果我切换到'偏好'并回到'家',我就放松了我的领域。我在'onActivityCreated'中添加'else Toast',当我执行'home => pref => home'时,出现Toast ..我没有saveInstanceState。 –