2014-03-05 43 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); 
}