programing

조각에서 활동 메서드 호출

stoneblock 2023. 7. 28. 21:45

조각에서 활동 메서드 호출

조각에서 내 활동의 메소드를 호출하려고 합니다.나는 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