2017-04-25 1 views
0

Activity 내에서 FragmentTransaction을 시작하고 ArgumentFragment으로 설정합니다. 내 onCreateView() 메서드 내에서 디버깅하고 같이 즉시onCreateView의 단편화 된 인수

Product product; 

@Override 
public void setArguments(Bundle args) { 
    super.setArguments(args); 

    product = (Product) args.getSerializable(Constants.KEY_PRODUCT); 
} 

이 모든 잘 작동하지만, 내 Fragment의 클래스 내에서

DetailFragment detailFragment = new DetailFragment(); 
Bundle bundle = new Bundle(); 
bundle.putSerializable(Constants.KEY_PRODUCT, navigate.product); 
detailFragment.setArguments(bundle); 

나는 setArgument 방법을 무시하고 Serializable 개체를 구문 분석 이전에 설정된 제품은 null입니다. 누군가 나에게 이것을 설명 할 수 있습니까? 그리고 이것을하기위한 올바른 접근 방법은 무엇입니까? Activity에서 :

DetailFragment detailFragment = DetailFragment.newInstance(navigate.product); 

그리고 조각의 :

public static DetailFragment newInstance(Product product) { 
     DetailFragment fragment = new DetailFragment(); 
     Bundle args = new Bundle(); 
     args.putSerializable(Constants.KEY_PRODUCT, product); 
     fragment.setArguments(args); 
     return fragment; 
    } 
의 I는 다음 코드 조각 결국 마이클 의해 답변을 다음

:

편집

내에서 getArgument()에 액세스하려고 시도하면

if (getArguments() != null) { 
    product = (Product) getArguments().getSerializable(Constants.KEY_PRODUCT); 
} 

Product 나의 설정되지 않습니다 : t은 null을 줄 것이다. 나는 다른 것을 놓쳤는가?

답변

1

onCreategetArguments으로 전화해야합니다.

안드로이드 Studio에서 프로젝트에 새 조각을 추가 할 때 생성 된 코드를 보면 : 인수가 befre라고 조각 생성자에서 설정되고 onCreate 이후 onCreate에서 철수하는

public class BlankFragment extends Fragment { 
// TODO: Rename parameter arguments, choose names that match 
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
private static final String ARG_PARAM1 = "param1"; 
private static final String ARG_PARAM2 = "param2"; 

// TODO: Rename and change types of parameters 
private String mParam1; 
private String mParam2; 


public BlankFragment() { 
    // Required empty public constructor 
} 

/** 
* Use this factory method to create a new instance of 
* this fragment using the provided parameters. 
* 
* @param param1 Parameter 1. 
* @param param2 Parameter 2. 
* @return A new instance of fragment BlankFragment. 
*/ 
// TODO: Rename and change types and number of parameters 
public static BlankFragment newInstance(String param1, String param2) { 
    BlankFragment fragment = new BlankFragment(); 
    Bundle args = new Bundle(); 
    args.putString(ARG_PARAM1, param1); 
    args.putString(ARG_PARAM2, param2); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (getArguments() != null) { 
     mParam1 = getArguments().getString(ARG_PARAM1); 
     mParam2 = getArguments().getString(ARG_PARAM2); 
    } 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragment_blank, container, false); 
} 

} 

조각 수명주기에 onCreateView을 입력하면 onCreateView 이상의이 인수에 액세스 할 수 있습니다.

+0

'product'는'setArguments()'에서 초기화 될 때'null' 출력되는 이유는 무엇입니까? – azizbekian

+0

@azizbekian'Fragment'가'FragmentManager'에 아직 추가되지 않았기 때문에'null'되었습니다.'FragmentManager'는 상태를 가진 조각을 죽이고 다시 생성 할 수 있습니다. 생성자 (이 경우'setArguments()'에서'product'를 설정하는 것은 생성자를 사용하는 것과 다르지 않지만'Bundle' 내에'getArguments()'가 리턴하는'product'를 여전히 가질 것입니다. – Kostyantin2216

+0

@ Kostyantin2216, get/set 인수의 요점을 얻습니다. 내가 대답 할 수없는 질문은 그 조각이 아직 시스템에 의해 파괴되지 않았기 때문에 그 조각이 "없어져 버린"이유입니다. 이것이 시나리오라면, 시스템이 프로세스를 죽이고 사용자가 다시 탐색 할 때 'product' 필드는 null이어야하지만, 그렇지 않으면 (번들에서도) 어떻게'번들 '이' 널 밖으로 나가. – azizbekian