2013-08-02 2 views
20

상상해 본다면 조각 A입니다.이 중 startDialogFragment (상자에 EditText이 있음)을 상상해보십시오. EditText에서 으로 값을 되돌릴 수있는 방법 FragmentA? 나는 this과 같은 것을 만들려고합니다. 그리고 this하지만 성공하지 못했습니다.DialogFragment에서 단편으로 데이터를 가져 오는 방법은 무엇입니까?

+1

http://stackoverflow.com/questions/17966605/fragments-how-to-start-dialog-from-fragment/17968000#17968000. 여기서 부울 값을 반환하는 대신 edittext 값을 반환합니다. 또는 인터페이스를 사용하십시오. – Raghunandan

+0

나는 그것을 시도 할 것이다)) 많이 고마워요 –

답변

65

방법이이 상황에서 유용합니다. getTargetRequestCode()이 필요합니다. 조각 사이에 설정 한 코드이므로 식별 할 수 있습니다. 또한, 일반적으로 단지 0 코드는 또한 너무

Intent intent = new Intent(); 
intent.putExtra("STRING_RESULT", str); 

처럼 당신이 너무 문자열을 연결할 수있는 Intent을, 잘 작동하고있는 경우, 요청 코드를 걸립니다 setTargetFragment(Fragment, requestCode)는 조각에 사용되어야한다 그 결과를 식별하기 위해 보낸 것입니다.

private void sendResult(int REQUEST_CODE) { 
    Intent intent = new Intent(); 
    intent.putStringExtra(EDIT_TEXT_BUNDLE_KEY, editTextString); 
    getTargetFragment().onActivityResult(
     getTargetRequestCode(), REQUEST_CODE, intent); 
} 

:

FragmentManager fm = getActivity().getSupportFragmentManager(); 
DialogFragment dialogFragment = new DialogFragment(); 
dialogFragment.setTargetFragment(this, REQUEST_CODE); 
dialogFragment.show(); 

데이터를 전송하기 위해 우리가 정의한이 조각을 사용 데이터합니다 (DialogFragment)를 전송하는 클래스 : 전반적으로, 당신은 다음과 같습니다 요청 단편 코드를 것 데이터를 수신하기 위해, 우리는 처음에 DialogFragment 시작 조각에서 클래스의 이러한 유형의 사용 :이 시점에서

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // Make sure fragment codes match up 
    if (requestCode == DialogFragment.REQUEST_CODE) { 
     String editTextString = data.getStringExtra(
      DialogFragment.EDIT_TEXT_BUNDLE_KEY); 

을, 당신은 당신의 EditText에서 문자열을 상위 단편의 DialogFragment에서 익명의 TextChangeListener() 익명 클래스에서 sendResult(int) 메서드를 사용하면 필요한 때에 텍스트가 전송됩니다.

+0

고마워요, 매우 유용합니다 –

+0

아주 좋은 explenation. 너는 내 하루를 구했다. 고마워요! – Kristopher

+0

안녕하세요.이 솔루션을 이용해 주셔서 감사합니다. 제발 도와주세요. 왜 내 onActivityResult() 메서드가 대화 상자 조각에서 결과를 캡처 할 수 없습니까? 동일한 코드가있을 때 ... 미리 감사드립니다! –

2

대화 상자의 데이터를 콜백 메소드를 통해 액티비티로 다시 보내야합니다. 그런 다음 액티비티가 원하는 데이터를 해당 프래그먼트로 되돌려 보내야합니다. 간단한 예 :

public void datFromDialog(String data){ 
    MyFragment mf = (MyFragment)getFragmentManager().findFragmentById(r.id.frag); 

    mf.iWantNewData(data); 
} 
+0

제발, 당신은 그것을 더 설명하거나 더 많은 exaple –

+0

보세요 http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity – tyczj

+0

내가 필요합니다 대신 단편과 의사 소통을하면 –

2

제목과 옵션 tag.And 대화에 대한 메시지를 표시하면 대화 상자가 열립니다 업로드 버튼의 클릭에, 서버에 어떤 파일을 업로드하는 상황을 가정 2 개의 단추가 들어있는 자체는 취소 및 계속을 말합니다.

레이아웃 xml 파일을 사용하여 원하는대로 UI를 만드십시오.

다음 DialogFragment를 확장하는 하나의 클래스를 만듭니다. onCreateView() 메서드 내에서 레이아웃을 확장하고 뷰를 초기화합니다.클래스 내부

하나의 인터페이스

public interface uploadDialogInterface 

    { 
     public void senddata(String title, String tag); 
    } 

    uploadDialogInterface interfaceObj; 
    String title=""; 
    String tag=" "; 

을 만들고 중요한 것은() 메소드는 onAttach를 오버라이드 (override) 할 필요가있다

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    this.context=context; 
    interfaceObj= (uploadDialogInterface) getTargetFragment(); 
} 

그리고 버튼에

같은 인터페이스 메소드를 호출 클릭에

 @Override 
public void onClick(View v) { 
    int id=v.getId(); 
    if(id== R.id.vB_fud_cancel) 
    { 
     dismiss(); 
    } 
    else if(id== R.id.vB_fud_upload) 
    { 
     title=mVideotitle.getText().toString(); 
     tag=mOptionaltag.getText().toString(); 
     if(mVideotitle.getText().toString().isEmpty()) { 
      Snackbar.make(mVideotitle,"Please enter the video title", Snackbar.LENGTH_SHORT).show(); 
     }else 
     { 
      interfaceObj.senddata(title,tag); 
      dismiss(); 

     } 
    } 
} 

그리고 대화 상자를 시작할 조각이나 활동 안에 setTargetFragment 속성을 포함합니다.

private void callUploadDialog() 
{ 
    UploadDialogFragment fragment = new UploadDialogFragment(); 
    fragment.setTargetFragment(this, 0); 
    FragmentManager manager = getFragmentManager(); 
    FragmentTransaction ft = manager.beginTransaction(); 
    ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_in); 
    fragment.show(ft, "UploadDialogFragment"); 
    fragment.setCancelable(false); 
} 

그리고 마지막으로 당신은

@Override 
public void senddata(String title,String optionaltag) { 
    this.videoTitle=title; 
    this.optionalTag=optionaltag; 

} 

내가이 게시물은 대한 대화 조각을 사용하는 사람들을 위해 도움이 될 것이라고 생각하는 방법을 인터페이스를 구현 (즉,이 대화 상자 조각 내부에 선언)과 오버라이드 (override) 처음으로 . 나는 그 해결책을 찾기 위해 고심했다. 그리고 이것은 미래에 누군가의 문제를 해결할 수 있기를 바랍니다. (죄송합니다 언어)

관련 문제