조각에서 활동 메서드 호출
조각에서 내 활동의 메소드를 호출하려고 합니다.나는 fragment가 메소드 데이터를 주고 메소드가 반환될 때 데이터를 받기를 원합니다.정적 메서드를 호출하는 것과 유사하지만 활동에 문제가 발생하기 때문에 정적 메서드를 사용하지 않는 것이 좋습니다.
단편적으로 처음이라 쉽고 교육적인 설명이 필요합니다!
감사합니다!
조각에서 활동으로:
((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();
하고 fragment를 에는 fragment를 사용합니다.tag
할 때 합니다.findFragmentByTag
대신:
YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");
다른 곳에서 사용하려는 경우 활동에서 조각을 분리해야 합니다.활동에서 구현하는 인터페이스를 만들어 이 작업을 수행할 수 있습니다.
따라서 다음과 같은 인터페이스를 정의할 수 있습니다.
예를 들어 활동에 문자열을 지정하고 정수를 반환하려고 했다고 가정합니다.
public interface MyStringListener{
public Integer computeSomething(String myString);
}
이 값은 fragment 또는 별도의 파일에 정의할 수 있습니다.
그러면 활동에서 인터페이스를 구현하게 됩니다.
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;
}
}
그런 다음 fragment에 MyStringListener 변수가 있고 Attach(Activity activity) 메서드에 수신기를 fragment로 설정합니다.
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()
Java 개발자용
((YourActivityClassName) getActivity()).methodName();
fragment가 어떻게 작동하는지 더 이해한 후 업데이트합니다.각 조각은 상위 활동에 속합니다.사용하기만 하면 됩니다.
getActivity().whatever
파편 안에서.당신은 불필요한 캐스팅을 피하기 때문에 더 나은 답변입니다.이 솔루션으로 깁스를 피할 수 없는 경우 아래의 것을 사용합니다.
============
당신이 해야 할 일은 외부 활동에 던지는 것입니다.
((MainActivity) getActivity()).Method();
새 인스턴스를 만드는 것은 Android 프레임을 혼란스럽게 하고 인식할 수 없게 됩니다. 참고 항목:
https://stackoverflow.com/a/12014834/1984636
https://stackoverflow.com/a/2042829/1984636
Marco's Answer를 완전히 좋아하지만 게시/구독 기반 프레임워크를 사용하여 예를 들어 이벤트 버스로 이동하는 경우 다음과 같은 결과를 얻을 수 있다는 점을 지적하는 것이 옳다고 생각합니다.
조각 :
EventBus.getDefault().post(new DoSomeActionEvent());
활동:
@Subscribe
onSomeActionEventRecieved(DoSomeActionEvent doSomeActionEvent){
//Do something
}
이 작업을 수행한 방법은 다음과 같습니다.
첫 번째 인터페이스 만들기
interface NavigationInterface {
fun closeActivity()
}
다음으로 활동이 인터페이스를 구현하고 인터페이스 방법을 재정의하는지 확인합니다.
class NotesActivity : AppCompatActivity(), NavigationInterface {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_notes)
setSupportActionBar(findViewById(R.id.toolbar))
}
override fun closeActivity() {
this.finish()
}
}
그런 다음 fragment에서 인터페이스 수신기를 생성해야 합니다.
private lateinit var navigationInterface: NavigationInterface
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
//establish interface communication
activity?.let {
instantiateNavigationInterface(it)
}
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_notes_info, container, false)
}
private fun instantiateNavigationInterface(context: FragmentActivity) {
navigationInterface = context as NavigationInterface
}
그런 다음 다음과 같은 전화를 걸 수 있습니다.
view.findViewById<Button>(R.id.button_second).setOnClickListener {
navigationInterface.closeActivity()
}
코틀린에서는 아래와 같은 프래그먼트에서 활동 메서드를 호출할 수 있습니다.
var mainActivity: MainActivity = activity as MainActivity
mainActivity.showToast() //Calling show toast method of activity
각 조각에서 활동 방법을 호출하는 가장 좋은 방법
(activity as YourActivity).activtiyMethod()
활동에서 이 줄을 사용합니다.예를들면
당신이 활동 A와 메소드 add()와 당신의 프래그먼트 ABC를 가지고 있고 당신이 프래그먼트 ABC에서 메소드 add를 부르고 싶다고 가정합니다.
(activity as A).add()
@BIJ 감사합니다.AY_JHA 및 @마나우스.Kotlin 버전을 사용하여 활동에 있는 signIn() 메서드를 호출했습니다. 이 메서드는 조각에서 호출됩니다.Android에서 Navigation Architecture를 사용하고 있으므로 수신기 인터페이스 패턴이 fragment:
(activity as MainActivity).signIn()
단편을 통해 활동에 명시된 기능에 액세스하려면 마르코의 답변과 같이 인터페이스를 사용하십시오.
활동을 통해 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
}
ViewpagerAdapter 클래스입니다.
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);
}
((your_activity) getActivity).method_name()
에▁where디your_activity
이고 활이니다입름동다입니다.method_name()
호출할 메서드의 이름입니다.
호출하려는 모든 메서드가 활동 상위가 동일한 Fragment에 있는 것은 아니기 때문에 이를 위한 최선의 방법을 찾고 있습니다.
당신의 파편 속에
public void methodExemple(View view){
// your code here
Toast.makeText(view.getContext(), "Clicked clicked",Toast.LENGTH_LONG).show();
}
활동 중
new ExempleFragment().methodExemple(context);
저는 이 스레드에 나와 있는 모든 방법을 사용해 보았지만 아무 것도 효과가 없었습니다. 이것을 사용해 보십시오.그것은 나에게 효과가 있었다.
((MainActivity) getContext().getApplicationContext()).Method();
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)
}
}
((YourActivityName)getActivity()).functionName();
예:((SessionActivity)getActivity()).changeFragment();
참고: 클래스 이름은 공용이어야 합니다.
조각에서 활동으로:
((활동 클래스 이름)에는 활동()이 필요합니다.공개 방법();
저는 그것을 통과하는 것이 더 나은 접근법이라고 생각합니다.activity
조각 초기화 시 인스턴스입니다.저는 아래와 같은 사례를 통과했습니다.
class FragmentSignUp : Fragment() {
private lateinit var authActivity: AuthenticateActivity
...
companion object {
fun newInstance(a: AuthenticateActivity): FragmentSignUp {
val fragment = FragmentSignUp()
fragment.authActivity = a
return fragment
}
}
}
이제 전달된 활동 인스턴스로 fragment를 초기화할 수 있으며 활동의 모든 공용 메서드를 호출할 수도 있습니다.아래와 같이:
val fragmentManager = supportFragmentManager
val fragment = FragmentSignUp.newInstance(this)
fragmentManager.beginTransaction().replace(R.id.authenticate_fragment, fragment, FragmentSignUp::class.java.simpleName)
.commit()
이제 다음과 같이 단편에서 활동 공개 방법에 액세스할 수 있습니다.
authactivity.goToLogInFragment()
Java에서 fragment 클래스는 다음과 같아야 합니다.
public class FragmentSignUp extends Fragment {
private AuthenticateActivity authActivity;
public static FragmentSignUp newInstance(AuthenticateActivity a) {
FragmentSignUp fragment = new FragmentSignUp();
fragment.authActivity = a;
return fragment;
}
}
참고: 활동을 fragment 생성자에 직접 주입할 수도 있습니다.그러나 대부분의 경우 런타임 문제가 발생할 수 있으므로 이러한 문제는 피해야 합니다.
언급URL : https://stackoverflow.com/questions/12659747/call-an-activity-method-from-a-fragment
'programing' 카테고리의 다른 글
C - 직렬화 기술 (0) | 2023.07.28 |
---|---|
데이터 프레임 인덱스에 함수 적용 (0) | 2023.07.28 |
상위 구성 요소의 Ajax 업데이트에서 하위 구성 요소를 제외하는 방법은 무엇입니까? (0) | 2023.07.28 |
CSS 16진수 RGBA? (0) | 2023.07.28 |
numpy 없이 python에서 변수 NaN 할당 (0) | 2023.07.28 |