2014-03-05 45 views
0

所以我有一个嵌套的片段,如:片段类字段被清零由于未知原因,

public class AbstractFragment extends Fragment { 
    public int resultCode; 

    protected void startFragment(AbstractFragment fragment, int resultCode){ 
     this.resultCode = resultCode; 
     Log.w(this, "startFragment(). fragment: "+fragment+" resultCode: "+this.resultCode); 
     ((MainActivity)getActivity()).addFragmentToBackStack(fragment); 
    } 
} 

,并在MainActivity有相应的方法:

public class MainActivity extends FragmentActivity { 
    public void addFragmentToBackStack(Fragment fragment){ 
     Log.w(this, "addFragmentToBackStack(). fragment: "+fragment+" resultCode: "+((AbstractFragment) fragment).resultCode); 
     getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.content_frame, fragment, fragment.getClass().getName()) 
     .addToBackStack(null) 
     .commit(); 
    } 
} 

和片段正在开始像

public class DynamicsFragment extends AbstractFragment{ 
public static final int DYNAMICS_CODE = 2; 
... 
startFragment(new DynamicsAddFragment(), DYNAMICS_CODE); 
... 
} 

我得到的结果是让我感到困惑,因为OOP的基本原理在这里不起作用accor丁登录:

03-05 21:35:05.700: W/DynamicsFragment(8533): startFragment(). fragment: DynamicsAddFragment{413453d8} requestCode: 2 
03-05 21:35:05.700: W/MainActivity(8533): addFragmentToBackStack(). fragment: DynamicsAddFragment{413453d8} requestCode: 0 

我检查了整个项目希望找到一些代码,我可能会设置resultCode 0却是没有。 resultCode正在设置的唯一位置是startFragment方法AbstractFragment和课程DynamicsAddFragment延伸AbstractFragment。如果创建了DynamicsAddFragment的新实例,但项目中没有这样的代码,那么resultCode将被设置为零。
两个日志输出行都会执行一个,后面跟着一个。但ATM startFragment运行resultCode字段初始化为2并且MainActivity方法运行字段的同时已经为空。例如,像String类型的其他字段也是如此。但是实例化的片段FOA是一个对象!而且你可以看到对象的运行时Id(唯一的运行时哈希内存ID {413453d8})是相同的!所以它有同样的对象!它不是同一个对象的新/另一个实例!怎么会这样?!

回答

0

你打电话this.resultCode = resultCode;this,即在DynamicsFragment,而后来你从不同的片段得到这个值,DynamicsAddFragment,我假设。这应该工作:

protected void startFragment(AbstractFragment fragment, int resultCode){ 
    fragment.resultCode = resultCode; 
    Log.w(this, "startFragment(). fragment: "+fragment+" resultCode: "+fragment.resultCode); 
    ((MainActivity)getActivity()).addFragmentToBackStack(fragment); 
}