2014-03-05 2 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 DynamicsFragment extends AbstractFragment{ 
public static final int DYNAMICS_CODE = 2; 
... 
startFragment(new DynamicsAddFragment(), DYNAMICS_CODE); 
... 
} 
처럼 시작되고

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(); 
    } 
} 

및 조각

내가 결과로 얻은 것은 완전히 나를 혼란스럽게 만든다. OOP의 기본 요소가 여기에서 작동하지 않는다. 딩은 로그에 :

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 

은 내가 잠재적 0- resultCode를 설정할 수 있지만, 아무도이없는 일부 코드를 찾을 것으로 예상 전체 프로젝트를 확인했습니다. resultCode이 설정되는 유일한 장소는 startFragment 방법이 AbstractFragment이고, 과정이 DynamicsAddFragmentAbstractFragment입니다. 또한 새 인스턴스 DynamicsAddFragment이 생성되었지만 프로젝트에 해당 코드가없는 경우 resultCode은 0으로 설정됩니다.
두 개의 로그 출력 행이 하나씩 실행되고 예상대로 실행됩니다. 그러나 ATM startFragment은 resultCode 필드가 2로 초기화되고 MainActivity 메소드가 실행될 때 동시에 필드가 비어 있습니다. 예를 들어 String 유형과 같은 다른 필드에서도 마찬가지입니다. 그러나 인스턴스화 된 FOA는 OBJECT! 그리고 당신이 볼 수 있듯이 객체의 런타임 Id (고유 한 런타임 해시 메모리 ID {413453d8})는 동일합니다! 그래서 그것의 defenitely 동일한 개체! 새로운 객체가 아니라 동일한 객체의 다른 인스턴스입니다! 어떻게 그럴수있어?!

답변

0

, 즉 DynamicsFragmentthis.resultCode = resultCode;을 전화하고 있습니다. 나중에 다른 조각 인 DynamicsAddFragment에서이 값을 얻고 있습니다. 작동해야 함 :

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