3

下面是我的代码:savedInstanceState总是在片段空

public class MyListFragmentActivity extends FragmentActivity{ 

@Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    System.out.println("DEBUG : MLFA onCreate"); 
    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction().replace(fragmentID, new MyListFragment()) 
      .replace(detailFragmentID, new MyDetailFragment()).commit(); 
     } 
    } 



    @Override 
    protected void onRestart() { 
      FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
      Fragment prevFrag = getSupportFragmentManager().findFragmentById(detailFragmentID); 
    if (prevFrag != null) { 
     fragmentTransaction.remove(prevFrag); 
     getSupportFragmentManager().beginTransaction().replace(detailFragmentID, new MyDetailFragment()).commitAllowingStateLoss(); 
    } else { 
     getSupportFragmentManager().beginTransaction().replace(detailFragmentID, new MyDetailFragment()).commitAllowingStateLoss(); 
    } 
} 

MyListFragment

public class MyListFragment extends Fragment{ 

//When we click on each item in list view call detail fragment to relad its layout 
OnItemClickListener onItemClickListener = new OnItemClickListener() { 

/** Getting the fragmenttransaction object, which can be used to add, remove or replace a fragment */ 
     FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
     /** Getting the existing detailed fragment object, if it already exists. 
     * The fragment object is retrieved by its tag name 
     * */ 
     Fragment prevFrag = getFragmentManager().findFragmentById(detailFragmentID); 

     /** Remove the existing detailed fragment object if it exists */ 
     if (prevFrag != null) { 
      fragmentTransaction.remove(prevFrag); 
      MyDetailFragment mydetailFragment = new MyDetailFragment(); 
      fragmentTransaction.replace(detailFragmentID, mydetailFragment); 
      fragmentTransaction.addToBackStack(null); 
      fragmentTransaction.show(getFragmentManager().findFragmentById(detailFragmentID)); 
      fragmentTransaction.commit(); 
     } 
} 

MyDetailFragment

public class MyDetailFragment extends Fragment{ 

@Override 
public void onCreate(Bundle savedInstanceState) { 
setRetainInstance(true); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    if (savedInstanceState != null) { 
    // it is not entering the inside here 
} 

@Override 
    public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
     // saving some values 
    } 

当我的标题我的设备后,我设置setRetainInstance(true); savedInstanceState始终为空,那么我如何才能在此保存我的值?

为什么这么说?我在这里做错了什么,以及如何解决这个问题?

回答

0

我认为你失去了你的instanceState,因为你一直在你的onRestart()方法中创建一个新的Fragment实例。

试试这样说:

@Override 
protected void onRestart() { 
    Fragment prevFrag = getSupportFragmentManager().findFragmentById(detailFragmentID); 
    if (prevFrag == null || !(prevFrag instanceof MyDetailFragment)) { 
     getSupportFragmentManager().beginTransaction().replace(detailFragmentID, new MyDetailFragment()); 
    } 
} 

这样,你只有唯一的,如果有相同类型的没有其他有效的片段附上片段的新实例。

请注意setRetainInstance(true);防止FragmentManager在发生配置更改时销毁您的Fragment实例。 因此,手动销毁你的Fragment(通过调用.remove(...))是没有意义的,然后用.replace(...,new MyDetailFragment())初始化一个新的。这就是为什么你总是得到一个空的savedInstanceState:你在一个新的实例,所以没有以前保存的状态!

还要记住,在FragmentTransaction上调用.commitAllowingStateLoss()可以让片段管理器避免保存savedInstanceState,因此只有在您确实知道自己在做什么时才应该使用它。

祝您有美好的一天! :)

0

根据安卓

的onSaveInstanceState()将默认为如果视图被调用,只有它有一个ID。

默认实现通过在具有ID的层次结构中的每个视图上调用onSaveInstanceState(),并保存当前焦点视图的ID来为您处理大部分UI每个实例状态(所有这些由onRestoreInstanceState(Bundle)的默认实现恢复)。

相关问题