답변:
단편에서 활동으로 :
((YourActivityClassName)getActivity()).yourPublicMethod();
활동에서 단편으로 :
FragmentManager fm = getSupportFragmentManager();
//if you added fragment via layout xml
YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id);
fragment.yourPublicMethod();
코드를 통해 프래그먼트를 추가하고 프래그먼트를 tag
추가 할 때 문자열을 사용한 경우 findFragmentByTag
대신 다음을 사용하십시오 .
YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");
다른 곳에서 사용하려는 경우 활동에서 프래그먼트를 분리하십시오. 활동이 구현하는 인터페이스를 작성하여이를 수행 할 수 있습니다.
따라서 다음과 같은 인터페이스를 정의합니다.
예를 들어 액티비티에 문자열을 제공하고 Integer를 리턴하도록한다고 가정하십시오.
public interface MyStringListener{
public Integer computeSomething(String myString);
}
이것은 조각 또는 별도의 파일에서 정의 될 수 있습니다.
그런 다음 활동에 인터페이스를 구현하게하십시오.
public class MyActivity extends FragmentActivity implements MyStringListener{
@Override
public Integer computeSomething(String myString){
/** Do something with the string and return your Integer instead of 0 **/
return 0;
}
}
그런 다음 조각에 MyStringListener 변수가 있고 조각 onAttach (Activity activity) 메서드에서 리스너를 설정합니다.
public class MyFragment {
private MyStringListener listener;
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
listener = (MyStringListener) context;
} catch (ClassCastException castException) {
/** The activity does not implement the listener. */
}
}
}
편집 (2015 년 12 월 17 일) :onAttach(Activity activity) is deprecated, use onAttach(Context context) instead, it works as intended
첫 번째 대답은 확실히 작동하지만 현재 조각과 호스트 활동을 결합합니다. 다른 활동에서 조각을 사용하려는 경우 조각을 호스트 활동에서 분리하는 것이 좋습니다.
들어 코 틀린의 개발자
(activity as YourActivityClassName).methodName()
들어 자바 개발자
((YourActivityClassName) getActivity()).methodName();
조각이 어떻게 작동하는지 더 이해 한 후에 업데이트하십시오. 각 조각은 부모 활동에 속합니다. 따라서 다음을 사용하십시오.
getActivity().whatever
조각 내에서. superflous 캐스트를 피하기 때문에 더 나은 대답입니다. 이 솔루션으로 캐스트를 피할 수 없으면 아래의 캐스트를 사용하십시오.
============
당신이해야 할 일은 외부 활동에 캐스팅하는 것입니다
((MainActivity) getActivity()).Method();
새 인스턴스를 만들면 안드로이드 프레임이 혼란스러워 인식 할 수 없습니다. 또한보십시오 :
프래그먼트를 통해 Activity에 선언 된 함수에 액세스하려면 marco의 답변에 표시된 인터페이스를 사용하십시오.
활동을 통해 Fragment에 선언 된 함수에 액세스하려면 태그 또는 ID가없는 경우 이것을 사용할 수 있습니다
private void setupViewPager(ViewPager viewPager) {
//fragmentOne,fragmentTwo and fragmentThree are all global variables
fragmentOne= new FragmentOne();
fragmentTwo= new FragmentTwo();
fragmentThree = new FragmentThree();
viewPagerAdapteradapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPagerAdapteradapter.addFragment(fragmentOne, "Frag1");
viewPagerAdapteradapter.addFragment(fragmentTwo, "Frag2");
viewPagerAdapteradapter.addFragment(fragmentThree, "Frag3");
//viewPager has to be instantiated when you create the activity:
//ViewPager viewPager = (ViewPager)findViewById(R.id.pager);
//setupViewPager(viewPager);
//Where R.id.pager is the id of the viewPager defined in your activity's xml page.
viewPager.setAdapter(viewPagerAdapteradapter);
//frag1 and frag2 are also global variables
frag1 = (FragmentOne)viewPagerAdapteradapter.mFragmentList.get(0);
frag2 = (FragmentTwo)viewPagerAdapteradapter.mFragmentList.get(1);;
//You can use the variable fragmentOne or frag1 to access functions declared in FragmentOne
}
이것은 ViewpagerAdapterClass입니다
class ViewPagerAdapter extends FragmentPagerAdapter {
public final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
이 대답은 나와 같은 멍청한 사람들을위한 것입니다. 좋은 하루 되세요.
((KidsStoryDashboard)getActivity()).values(title_txt,bannerImgUrl);
public void values(String title_txts, String bannerImgUrl) {
if (!title_txts.isEmpty()) {
//Do something to set text
}
imageLoader.displayImage(bannerImgUrl, htab_header_image, doption);
}
이 스레드에 표시된 모든 방법으로 시도했지만 아무도 효과가 없었습니다. 그것은 나를 위해 일했다.
((MainActivity) getContext().getApplicationContext()).Method();
((YourActivityName)getActivity()).functionName();
예 : ((SessionActivity)getActivity()).changeFragment();
참고 : 클래스 이름은 공개되어야합니다
Kotlin을 사용해보십시오.
class DataForm : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
Tasks(this).getData()
}
fun getResponse(response: String) {
// code
}
}
class Tasks(private val context: Any) {
fun getData() {
val getContext = (context as DataForm).activity
val getFragment = (context as DataForm)
val responseListener = Response.Listener<String> { response ->
getFragment.getResponse(response)
}
val errorListener = Response.ErrorListener { error ->
error.printStackTrace();
}
val stringRequest = StringRequest(Request.Method.GET, url, responseListener, errorListener)
Volley.newRequestQueue(getContext).add(stringRequest)
}
}