0

FragmentPagerAdapter를 사용하여 탭을 표시하는 DialogFragment가 있습니다. 각 탭에는 RecyclerView를 사용하는 다른 Fragment가 있습니다. Fragment로 전달 된 항목을 가져올 수는 있지만, Fragment에서 DialogFragment로 데이터를 가져 와서 호출 액티비티에 전달하려면 어떻게해야합니까?DialogFragment 안에있는 Fragment에서 데이터를 가져 오는 방법은 무엇입니까?

TabDialog를 확장 DialogFragment :

public class TabDialog extends DialogFragment { 

public interface OnCompleteListener{ 
    void onCompleteListener(String test); 
} 

private OnCompleteListener mListener; 

TabLayout tabLayout; 
ViewPager viewPager; 
FragmentTabPositive tabPositive = new FragmentTabPositive(); 
FragmentTabNegative tabNegative = new FragmentTabNegative(); 
TabAdapter adapter; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 
    getDialog().setCanceledOnTouchOutside(true); 
    View rootView = inflater.inflate(R.layout.dialog_layout, container, false); 
    tabLayout = (TabLayout) rootView.findViewById(R.id.tabLayout1); 
    viewPager = (ViewPager) rootView.findViewById(R.id.masterViewPager); 
    adapter = new TabAdapter(getChildFragmentManager()); 
    adapter.addFragment("Positive", tabPositive); 
    adapter.addFragment("Negative", tabNegative); 
    viewPager.setAdapter(adapter); 
    tabLayout.setupWithViewPager(viewPager); 

    return rootView; 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    try{ 
     this.mListener = (OnCompleteListener)context; 
    } catch(ClassCastException e){ 
     throw new ClassCastException(context.toString() + 
       " must Implement OnCompleteListener"); 
    } 

} 

TabAdapter이 FragmentTabPos 내 onCreateView 내부 FragmentPagerAdapter

public class TabAdapter extends FragmentPagerAdapter { 

List<Fragment> mFragmentCollection = new ArrayList<>(); 
List<String> mTitleCollection = new ArrayList<>(); 

public TabAdapter(FragmentManager fm){ 
    super(fm); 
} 

public void addFragment(String title, Fragment fragment){ 

    mTitleCollection.add(title); 
    mFragmentCollection.add(fragment); 
} 

@Override 
public CharSequence getPageTitle(int position){ 
    return mTitleCollection.get(position); 
} 

@Override 
public int getCount(){ 
    return mFragmentCollection.size(); 
} 

@Override 
public Fragment getItem(int position) { 
    return mFragmentCollection.get(position); 
} 

를 확장

popupAdapter = new PopupAdapter(view.getContext(), list); 
    recyclerView.setAdapter(popupAdapter); 

    popupAdapter.setmListener(new PopupAdapter.OnPointClickedListener() { 
     @Override 
     public void OnItemClicked(String test) { 
      //This works 
      Toast.makeText(FragmentTabPositive.this.getContext(), test + " Inside FragTabPos", Toast.LENGTH_LONG).show(); 
     } 
    }); 

답변

0

해결 : Fragment에 자체 리스너를 구현하고 DialogFragment에서 트리거해야했습니다. 거기에서 OnCompleteListener를 사용하여 데이터를 호출하는 Activity로 다시 전달합니다.

0

Fragments를 너무 강하게 연결하지 않으려면 개인적으로 새 아키텍처 구성 요소를 사용하여 해당 데이터를 전송하는 것이 좋습니다.

AndroidViewModel을 사용하여 데이터를 전달할 수 있습니다. https://developer.android.com/topic/libraries/architecture/index.html

다른 방법으로, 부모 (들) 한 조각에서 데이터를 게시하는 이벤트 버스를 사용할 수 있습니다 여기에

은 안드로이드 개발자 사이트에 소개합니다.

하나는 이러한 라이브러리 : https://github.com/greenrobot/EventBus

아키텍처 구성 요소를 사용하는 보너스는 구글의 최신 응용 프로그램의 설계 기준을 따르는 것입니다.

관련 문제