2016-06-21 84 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。 –