2

ListFragment를 확장하는 Fragment의 onActivityCreated 메소드에서 DialogFragment의 제목을 설정하려고합니다.ListFragment의 DialogFragment에 setTitle() 호출

public void onActivityCreated(Bundle savedState) { 
    super.onActivityCreated(savedState); 
    ListView lv = this.getListView(); 
    lv.setOnItemLongClickListener(new OnItemLongClickListener() { 

     public boolean onItemLongClick(AdapterView<?> arg0, View arg1, 
       int pos, long id) { 

      android.app.FragmentManager fragmentManager = getFragmentManager(); 
      FragmentTransaction fragmentTransaction = fragmentManager 
        .beginTransaction(); 
      RatingDialogFragment newFragment = new RatingDialogFragment(); 
      newFragment.getDialog().setTitle("String"); 
      fragmentTransaction.add(newFragment, "dialog"); 
      newFragment.show(fragmentTransaction, "dialog"); 

      return true; 
     } 
    }); 
} 

DialogFragment의 mDialog가 여전히 null이기 때문에 널 포인터 예외가 발생합니다.

은 참조 :이 문제를 해결하는 방법에 대한 DialogFragment.getDialog returns null

어떤 아이디어?

답변

8

이 문제를 해결할 수있는 방법 중 하나는 Fragment이 만들어 지도록 허용하여 제목을 설정하는 것이 안전 할 때 결정합니다.

예를 들어, 생성자에서 제목을 전달하여 멤버 변수에 유지할 수 있습니다. 그런 다음 RatingDialogFragment에

RatingDialogFragment newFragment = new RatingDialogFragment("String"); 

: 당신의 RatingDialogFragment 수명주기의

... 
public RatingDialogFragment(String title) { 
    mTitle = title; 
} 
... 

어딘가에, 그것은 실제로 제목을 설정, 그렇게하는 것이 안전합니다.

... 
@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // Set title for this dialog 
     getDialog().setTitle(mTitle); 
    } 

편집 :이 문제는이 특별한 경우에 작동하지만, 더 나은 일반적인 접근은 setArguments()getArguments() 방법을 통해 인수를받을 Fragment의 능력을 사용하는 것입니다 주목할 가치가있다. 이렇게하면 기본 빈 생성자를 유지하여 프레임 워크가 올바르게 조각화 할 수 있습니다 (예 : XML로 단편을 도입 한 경우). 예는 found here 일 수 있습니다. documentation에서

:

모든 조각이 빈 생성자가 있어야합니다, 그래서 그것의 활동 상태를 복원 할 때 인스턴스화 될 수 있습니다. 은 프래그먼트가 다시 인스턴스화될 때 이러한 생성자가 호출되지 않으므로 서브 클래스에 매개 변수가있는 다른 생성자가없는 것이 좋습니다. 대신 인수는 에 의해 setArguments (Bundle)로 호출하고 나중에 Fragment (getArguments())로 검색 할 수 있습니다.

+1

고마워요! String을 RatingDialogFragment 생성자를 통해 전달한 다음, RatingDialogFragment의 onCreateDialog에서 setTitle을 호출하면 트릭이 수행됩니다. – edst

관련 문제