2016-06-21 2 views
1

많은 활동에서 사용되는 대화 상자 A가 있습니다. 새 대화 B를 만들고 인터페이스를 구현하여 A에서 호출을 얻었습니다. 두 경우 모두 대화 상자 조각을 사용했습니다. 많은 활동을 위해 내가 사용대화 상자 단편에서 대화 상자 조각으로 결과를 수신하는 방법

if (getActivity() instanceof MyActivity) 
((MyActivity) getActivity()).manageSelectedItem(); 

에서 콜백을 관리 할 수 ​​있습니다 그러나 대화 A는 또 다른 대화 상자가 B에서 호스팅되는 경우 다음 방법 콜백을 관리 할 수 ​​있습니다.

나는 Activity/FragmentActivity/Fragment를 기반으로하는 해결책을 찾았으니 this이지만 DialogFragment에서 문제를 해결할 수는 없습니다.

+0

여기

는 A와 코드

대화 DialogTwo입니까? 당신은'DialogFragment' B에서'DialogFragment' A로 데이터를 전달하려고합니까? 발견 한 해결책은 무엇입니까? –

답변

1

나는 벌어 질 그냥 대화 B.Checks의 인터페이스를 구현 호스팅 대화 상자가 활동/대화 여부 대화 A의에서 onCreate 방식으로 인터페이스를 초기화 해결했다. 대화 상자 B에서

public class DialogTwo extends DialogFragment { 


@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    try { 
     if(!(getActivity() instanceof SelectedItemListener)) { 
      callback = (SelectedItemListener) getTargetFragment(); 
     } 
    } catch (Exception e) { 
     throw new ClassCastException("Calling Fragment must implement SelectedItemListener"); 
    } 

} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return super.onCreateView(inflater, container, savedInstanceState); 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(getActivity(), R.style.AlertDialogCustom)); 

    builder.setTitle(R.string.select_color) 
      .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        if (getActivity() instanceof SelectedItemListener) { 
          ((NewExerciseActivity) getActivity()).manageSelectedItem(); 
        }else { 
         callback.manageSelectedItem(); 
        } 
       } 
      }) 
      .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
       } 
      }); 

    return builder.create(); 
    } 
} 

전화 : 문제는 다시 무엇

private void showDialog() { 
    FragmentActivity activity = (FragmentActivity) getActivity(); 
    FragmentManager fm = activity.getSupportFragmentManager(); 
    DialogTwo dialogTwo = new DialogTwo(); 
    dialogTwo.setTargetFragment(this,0); 
    dialogTwo.show(fm, "dialogTwo"); 
} 

@Override 
public void manageSelectedItem() { 
     //do something 
} 
1

Bus을 보거나 BroadcastReceiver을 사용하면 멀티플 콜백을 통해 코드를 결합 할 수 있으며 이는 유지 관리에 끔찍한 일입니다.

+0

감사합니다. 내 솔루션을 게시했습니다. – Patriotic

1

답변은 heare입니다. 또는 beerwin 활동 조각을 잠글 수 있습니다.

getSuportFragmentManager().findFragmentByTag(TAG_FRAGMENT_A).callback(); 
+0

감사합니다. 내 솔루션을 게시했습니다. – Patriotic