কোনও খণ্ড থেকে কোনও ক্রিয়াকলাপ পদ্ধতি কল করুন


318

কোনও খণ্ড থেকে আমার ক্রিয়াকলাপে কোনও পদ্ধতি কল করার চেষ্টা করছি। আমি চাই খণ্ডটি পদ্ধতিটি ডেটা দিতে এবং পদ্ধতিটি ফিরে আসার সময় ডেটা পেতে। আমি একটি স্থিতিশীল পদ্ধতিতে কল করার অনুরূপ অর্জন করতে চাই, তবে স্থির ব্যবহার ছাড়াই কারণ এটি ক্রিয়াকলাপে সমস্যা তৈরি করে।

খণ্ডগুলিতে নতুন তাই আমার একটি সহজ এবং শিক্ষাগত ব্যাখ্যা প্রয়োজন!

ধন্যবাদ!

উত্তর:


820

খণ্ড থেকে ক্রিয়াকলাপ পর্যন্ত:

((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");

5
কাস্ট যদি কাজ না করে তবে অপ্রত্যাশিত ঘটনা ঘটতে সাবধান হন ..: এস
ইওকস

48
Castালাই সমস্যাটি এড়াতে ব্যবহার করুন: ক্রিয়াকলাপ আইন = getActivity (); যদি (আপনার কার্যকলাপClassName উদাহরণ হিসাবে কাজ করুন) ((YourActivityClassName) আইন) .আপনারপলিটকমেথড (); }
এরিকরোলো

@ রিচার্ড: আমরা যদি ক্রিয়াকলাপের মধ্যে কোনও খণ্ডের পদ্ধতিটি সম্পাদন করতে পারি তবে আমরা কীভাবে বিপরীত ক্রিয়া সম্পাদন করতে পারি?
হিমাংশু

5
এটি একটি ক্রিয়াকলাপ কাস্ট করা খারাপ নকশা এবং অনিরাপদ। একটি খণ্ড কোনও নির্দিষ্ট ক্রিয়াকলাপের মধ্যে সীমাবদ্ধ নয়।
আভিভ বেন শাবাত

3
@ কে অগত্যা নয়। টুকরো টুকরো টুকরো টুকরো টুকরো করা যে কোনও বৃহত ক্রিয়াকলাপগুলির "টুকরা" হিসাবে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ প্রতিক্রিয়াশীল ইউআই তৈরি করতে। আমি একই অংশটি খুব কমই ব্যবহার করি এবং এটিকে বিভিন্ন ক্রিয়াকলাপের হোস্টগুলিতে সংযুক্ত করি।
রিচার্ড

201

আপনি যদি অন্য কোথাও এটি ব্যবহার করতে চান তবে আপনার ক্রিয়াকলাপ থেকে খণ্ডটি দ্বিগুণ করার চেষ্টা করা উচিত। আপনার কার্যকলাপ প্রয়োগ করে এমন একটি ইন্টারফেস তৈরি করে আপনি এটি করতে পারেন।

সুতরাং আপনি নীচের মত একটি ইন্টারফেস সংজ্ঞায়িত করতে হবে:

ধরুন উদাহরণস্বরূপ আপনি এই ক্রিয়াকলাপটিকে একটি স্ট্রিং দিতে চেয়েছিলেন এবং এটির একটি পূর্ণসংখ্যার ফিরিয়ে দিতে চান:

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;
  }

}

তারপরে আপনার খণ্ডে আপনার একটি মাইস্ট্রিংলিস্টনার ভেরিয়েবল থাকবে এবং আপনি শ্রোতাদের অনাচা (ক্রিয়াকলাপ ক্রিয়াকলাপ) পদ্ধতিতে খণ্ডন করতে পারবেন।

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. */
            }
        }

    }

সম্পাদনা করুন (17.12.2015):onAttach(Activity activity) is deprecated, use onAttach(Context context) instead, it works as intended

প্রথম উত্তরটি অবশ্যই কাজ করে তবে এটি আপনার বর্তমান খণ্ডটিকে হোস্টের ক্রিয়াকলাপের সাথে জুড়ে দেয়। আপনি যদি অন্য কোনও সংবেদনশীলতায় এটি ব্যবহার করতে চান তবে হোস্টের ক্রিয়াকলাপ থেকে খণ্ডটিকে ডুপ্লুড করে রাখা ভাল অভ্যাস।


58
অন্য যে কেউ এটির দিকে নজর রাখছেন, যদিও গ্রহণযোগ্য উত্তরটি স্পষ্টতই কাজ করে, এটি ডিজাইনের দৃষ্টিকোণ থেকে ভাল, এবং নিরাপদ approach
পল রিখটার

7
কোড ডিজাইনের ক্ষেত্রে এই উত্তরটি আরও ভাল। এছাড়াও যদি ক্রিয়াকলাপ ভুল হয়ে যায় তবে এটি ক্র্যাশ ঘটায় না
ডেভিড টি।

3
+1 তবে আমি অনাচাতে কোনও চেষ্টা করবো না। এটি ব্যর্থ হতে দিন। যদি শ্রোতা alচ্ছিক হয় (তবে এটি ব্যর্থতা যথাযথ নয়), খণ্ডে একটি সেট / অ্যাডলিস্টনার পদ্ধতি যুক্ত করুন।
ataulm

বিপরীত দিকের যোগাযোগের জন্য দয়া করে দেখুন: বিকাশকারী এবং অ্যান্ড্রয়েড / ট্রেনিং / বেসিক্স / ফ্রেগমেন্টস / । খণ্ডটির ইন্টারফেস ব্যবহার করে (যা উপরে বর্ণিত অনুসারে ফ্রেগমেন্ট-> ক্রিয়াকলাপ কম করারও নিরাপদ উপায়) আপনি আপনার ক্রিয়াকলাপ থেকে আপনার অংশে থাকা কোনও পদ্ধতিতে কল করতে পারেন পাশাপাশি আপনি যদি আপনার খণ্ড-> ক্রিয়াকলাপের উপর ভিত্তি করে কোনও পদক্ষেপ নিতে চান Comm।
কেরেম

খণ্ডগুলি হ'ল বোঝানো হয় যে কোনও ক্রিয়াকলাপ পুনরায় ব্যবহৃত এবং সেট করা। যদি আমার একই ফ্র্যাগমেন্ট ব্যবহার করে 5 টি ক্রিয়াকলাপ হয়?
আন্তঃখণ্ড

50

জন্য Kotlin ডেভেলপারদের

(activity as YourActivityClassName).methodName()

জন্য জাভা ডেভেলপারদের

((YourActivityClassName) getActivity()).methodName();

কোটলিনে এটি ত্রুটি দেয় যদি আমরা এই কোডটি চালাই .. তবে অন্য কোনও উপায় আছে?
জেক গার্বো

1
আমি যখন এটি চালাতে। আমি অ্যাক্টিভিটি ক্লাসের নাল মান পাই, আমার মনে হয় কোটলিনে কোনও ত্রুটি না করে এটি করা এটি সঠিক উপায় নয়। বা একটি বাগ হতে পারে?
জেক গার্বো

@ জেকগার্বো এটির সঠিক উপায়ে অন্যথায় 12 জন এটির পক্ষে ভোট দেয় নি। দ্বিতীয় জিনিসটি কিছু সময় getActivity () প্রত্যাবর্তন করে এসও এগুলি পরীক্ষা করে দেখুন।
ওয়াসিম কে মেমন

@ জেকগার্বো ইয়া তারা আপনাকে জানিয়েছিল। যদি এটি আপনার পক্ষে কাজ করে তবে এটির প্রশংসা করুন বা অন্য কোনও উপায় সন্ধান করুন বা কীভাবে কোডিং করবেন তা শিখুন।
ওয়াসিম কে মেমন

13

খণ্ডগুলি কীভাবে কাজ করে তা আরও বুঝতে পারার পরে আপডেট করুন। প্রতিটি খণ্ডটি পিতামাতার ক্রিয়াকলাপের অন্তর্ভুক্ত। সুতরাং কেবল ব্যবহার করুন:

getActivity().whatever

খণ্ডের মধ্যে থেকে। এটি সর্বোত্তম উত্তর কারণ আপনি অতিশয় ক্যাসেটগুলি এড়ান। আপনি যদি এই সমাধান সহ কাস্টগুলি এড়াতে না পারেন তবে নীচেরটিটি ব্যবহার করুন।

============

আপনাকে যা করতে হবে তা হ'ল বাইরের ক্রিয়াকলাপ cast

((MainActivity) getActivity()).Method();

একটি নতুন উদাহরণ তৈরি করা অ্যান্ড্রয়েড ফ্রেমকে বিভ্রান্ত করবে এবং এটি এটি সনাক্ত করতে সক্ষম হবে না। আরো দেখুন :

https://stackoverflow.com/a/12014834/1984636

https://stackoverflow.com/a/2042829/1984636


9

যদিও আমি মার্কোর উত্তর পুরোপুরি পছন্দ করি আমার মনে হয় এটা ঠিক যে আপনি একইভাবে ফলাফল অর্জনের জন্য একটি প্রকাশ / সাবস্ক্রাইব ভিত্তিক কাঠামো ব্যবহার করতে পারেন উদাহরণস্বরূপ আপনি ইভেন্ট বাসের সাথে যান তবে আপনি নিম্নলিখিতটি করতে পারেন

টুকরা :

EventBus.getDefault().post(new DoSomeActionEvent()); 

কার্যক্রম:

 @Subscribe
onSomeActionEventRecieved(DoSomeActionEvent doSomeActionEvent){
//Do something

}

5

কোটলিনে আপনি নীচের মত টুকরা থেকে ক্রিয়াকলাপ পদ্ধতি কল করতে পারেন:

var mainActivity: MainActivity = activity as MainActivity
        mainActivity.showToast() //Calling show toast method of activity

2

আপনার খণ্ডের মাধ্যমে আপনার ক্রিয়াকলাপে ঘোষিত কোনও ফাংশন অ্যাক্সেসের জন্য দয়া করে একটি ইন্টারফেস ব্যবহার করুন, যেমন মার্কোর উত্তরে দেখানো হয়েছে।

আপনার ক্রিয়াকলাপের মাধ্যমে আপনার টুকরাটিতে ঘোষিত কোনও ফাংশন অ্যাক্সেসের জন্য আপনি যদি ট্যাগ বা কোনও আইডি না পান তবে আপনি এটি ব্যবহার করতে পারেন

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


}

এটি ভিউপাগারআডাপ্টারক্লাস

    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);
    }
}

এই উত্তরটি আমার মতো নুবুদের জন্য। আপনার দিনটি শুভ হোক.


1

এটি খণ্ড শ্রেণীর ...

((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);
}

1

আমি এই থ্রেডে প্রদর্শিত সমস্ত পদ্ধতির সাথে চেষ্টা করেছি এবং আমার পক্ষে কেউ কাজ করেনি, এটি চেষ্টা করে দেখুন। এটা আমার জন্য কাজ করেছে।

((MainActivity) getContext().getApplicationContext()).Method();

0

আমি এটি করার সর্বোত্তম উপায়টি সন্ধান করছি যেহেতু আমরা কল করতে চাইলে প্রতিটি পদ্ধতি একই ক্রিয়াকলাপের সাথে ফ্রেগমেন্টে অবস্থিত না।

আপনার খণ্ডে

public void methodExemple(View view){

        // your code here

        Toast.makeText(view.getContext(), "Clicked clicked",Toast.LENGTH_LONG).show();
    }

আপনার ক্রিয়াকলাপে

new ExempleFragment().methodExemple(context); 


0
((your_activity) getActivity).method_name()

your_activityআপনার ক্রিয়াকলাপের নাম কোথায় এবং method_name()আপনি যে পদ্ধতিতে কল করতে চান তার নাম।


0

কোটলিনের জন্য এটি চেষ্টা করে দেখুন

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)
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.