অ্যান্ড্রয়েডে ক্রিয়াকলাপ থেকে টুকরো টুকরো প্রেরণ করুন


316

আমার দুটি ক্লাস আছে। প্রথমটি ক্রিয়াকলাপ, দ্বিতীয়টি হ'ল একটি খণ্ড যেখানে আমার কিছু আছে EditText। ক্রিয়াকলাপে আমার একটি অ্যাসিঙ্ক-টাস্ক সহ একটি সাবক্লাস রয়েছে এবং পদ্ধতিতে doInBackgroundআমি কিছু ফলাফল পেয়েছি, যা আমি পরিবর্তনশীলে সংরক্ষণ করি। সাবক্লাস "আমার ক্রিয়াকলাপ" থেকে এই টুকরোটিতে আমি কীভাবে এই পরিবর্তনশীলটি প্রেরণ করতে পারি?

উত্তর:


662

ক্রিয়াকলাপ থেকে আপনি ডেটা প্রেরণের উদ্দেশ্যে হিসাবে:

Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);

এবং ফ্র্যাগমেন্ট অনক্রিট ভিউ পদ্ধতিতে:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}

15
আপনি কি টুকরো টুকরো একটি জিনিস পাস করতে পারেন?
ইয়াহমান

63
হুম আমি কল করার সময় একটি নালপয়েন্টার এক্সসেপশন পেয়েছিgetArguments().getString(key)
নিমা জি

9
নলপয়েন্টারএক্সেপশন "স্ট্রিং স্ট্রেক্সট সেট সেটআর্গমেন্টস ()। গেটস্ট্রিং (" এডিটেক্সট ");"
জর্জেসিস

4
খণ্ডে বান্ডিল সামগ্রী পড়ার সময় সর্বদা প্রথমে getArguments পদ্ধতি ব্যবহার করে একটি বান্ডিল বস্তুতে বান্ডিলটি গ্রহণ করে এবং নালটির বিপরীতে এটি পরীক্ষা করুন। অন্যথায়, getString পদ্ধতি নালায় প্রয়োগ করা হবে এবং সুতরাং যখন কোনও বান্ডেল পাস না হয় তখন এনপিই। বান্ডেলটি পাস না হয়ে গেলে নাল পয়েন্টার ব্যতিক্রমগুলি এড়ানো হবে।
বালচাঁদর্কম

3
@Aznix। খণ্ডের জন্য কনস্ট্রাক্টর তৈরি করার পরামর্শ দেওয়া হয় না।
আজম

108

এছাড়াও আপনি খণ্ড থেকে ক্রিয়াকলাপের ডেটা অ্যাক্সেস করতে পারেন:

কার্যক্রম:

public class MyActivity extends Activity {

    private String myString = "hello";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        ...
    }

    public String getMyData() {
        return myString;
    }
}

টুকরা:

public class MyFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        MyActivity activity = (MyActivity) getActivity();
        String myDataFromActivity = activity.getMyData();
        return view;
    }
}

78
এই সমাধানটি আপনার ক্রিয়াকলাপ এবং টুকরাটির মধ্যে টানটান সংযুক্তিকে সংহত করে, Bundleতথ্য পাস করার জন্য ক্লাসটি ব্যবহার করা আরও ভাল । বিকল্পভাবে আপনি সেই getMyData()পদ্ধতিটি কোনও ইন্টারফেস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত এবং প্রয়োগ করতে পারেন এবং FragmentgetActivity কোনও instanceofইন্টারফেসে ফিরে আসে কিনা তা পরীক্ষা করে দেখতে পারেন onAttach()
রুডি কেরশা

1
এই সমাধানটি আমার পক্ষে সেরা। এছাড়াও যদি মাইস্ট্রিংটি সর্বজনীন হয় তবে আপনি getMyData () পদ্ধতিটি ঘোষণা করেন নি
বুরাক

1
বর্তমান গৃহীত উত্তরগুলি নাল পয়েন্টার ব্যতিক্রম দেয়। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত
রিচমন্ড

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

51

আমি এখানে @ স্ট্যাকওভারফ্লো.কম. এর অনেক উত্তর পেয়েছি তবে অবশ্যই এটির সঠিক উত্তর:

"অ্যান্ড্রয়েডে ক্রিয়াকলাপ থেকে টুকরো টুকরোতে ডেটা পাঠানো"।

কার্যক্রম:

        Bundle bundle = new Bundle();
        String myMessage = "Stackoverflow is cool!";
        bundle.putString("message", myMessage );
        FragmentClass fragInfo = new FragmentClass();
        fragInfo.setArguments(bundle);
        transaction.replace(R.id.fragment_single, fragInfo);
        transaction.commit();

টুকরা:

খণ্ডে মান পড়া

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Bundle bundle = this.getArguments();
        String myValue = bundle.getString("message");
        ...
        ...
        ...
        }

বা শুধু

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        String myValue = this.getArguments().getString("message");
        ...
        ...
        ...
        }

আমার ধারণা, কোনও লিস্টভিউতে কুকি টেক্সটসবিট-অনুসন্ধান-ফলাফল আপডেট করার জন্য এটি সেরা পন্থা নয়, যা কোনও খণ্ডের অভ্যন্তরে বাসা বেঁধে আছে (যদি সোমিবিডি দ্রুত টাইপ করেন, তবে তিনি দ্বিতীয় বার দুটি বার বার বার প্রেরণ করবেন)?
মার্টিন ফেফার

1
স্ট্রিং বা ইন্টি অবজেক্ট অবজেক্ট সম্পর্কে কী?
দারিও

2
@ জর্জেসিস এই সমাধান সম্পর্কে কি? বিকাশকারী.অ্যান্ড্রয়েড
ট্রেনিং

23

এই উত্তরটি খুব দেরিতে হতে পারে। তবে এটি ভবিষ্যতের পাঠকদের জন্য কার্যকর হবে।

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

পদক্ষেপ 1: মূল ক্রিয়াকলাপে ইন্টারফেস তৈরি করুন।

   public interface SelectedBundle {
    void onBundleSelect(Bundle bundle);
   }

পদক্ষেপ 2: একই ক্রিয়াকলাপে নির্বাচিতবান্ডেল রেফারেন্স তৈরি করুন

   SelectedBundle selectedBundle;

পদক্ষেপ 3: একই কার্যকলাপে পদ্ধতি তৈরি করুন

   public void setOnBundleSelected(SelectedBundle selectedBundle) {
       this.selectedBundle = selectedBundle;
   }

পদক্ষেপ 4: সিলেক্টবান্ডেল রেফারেন্সটি শুরু করতে হবে যা সমস্ত টুকরোগুলি ফাইলপিকারের কার্যকারিতা প্রয়োজন You আপনি এই কোডটি আপনার খণ্ড onCreateView(..)পদ্ধতিতে রাখুন

    ((MainActivity)getActivity()).setOnBundleSelected(new MainActivity.SelectedBundle() {
          @Override
         public void onBundleSelect(Bundle bundle) {
            updateList(bundle);
        }
     });

পদক্ষেপ 5: আমার কেস, আমাকে হোমঅ্যাক্টিভিটি থেকে টুকরো টুকরো করে ছবিটি উরি পাস করতে হবে। সুতরাং, আমি কার্যকারিতা ফলাফল পদ্ধতিতে এই কার্যকারিতাটি ব্যবহার করেছি।

মেইনএকটিভিটি থেকে onActivityResult, ইন্টারফেস ব্যবহার করে ভঙ্গিকে মানগুলি পাস করুন।

দ্রষ্টব্য: আপনার ক্ষেত্রে ভিন্ন হতে পারে। আপনি আপনার হোমঅ্যাক্টিভিটি থেকে যে কোনও জায়গা থেকে কল করতে পারেন।

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent  data) {
       selectedBundle.onBundleSelect(bundle);
  }

এখানেই শেষ. ফ্রেগমেন্টক্লাসে আপনার প্রয়োজন প্রতিটি খণ্ড প্রয়োগ করুন। তুমি মহান. তুমি করেছ. কি দারুন...


15

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

সুতরাং এ -> এফ থেকে ডেটা পাসিং ρяσѕρєя কে দ্বারা ব্যাখ্যা করা একই হতে চলেছে that উত্তর ছাড়াও, কোনও ক্রিয়াকলাপের মধ্যে খণ্ডগুলি তৈরি করার পরে, আমরা টুকরোগুলিকে টুকরোগুলিতে কল করার পদ্ধতিতেও ডেটা পাঠাতে পারি।

উদাহরণ স্বরূপ:

    ArticleFragment articleFrag = (ArticleFragment)
                    getSupportFragmentManager().findFragmentById(R.id.article_fragment);
    articleFrag.updateArticleView(position);


15

সেরা এবং সুবিধাজনক পদ্ধতির হ'ল খণ্ড খণ্ডকে কল করা এবং সেই সময় ডেটা প্রেরণ করা। ডিফল্টভাবে প্রতিটি খণ্ডে উদাহরণ পদ্ধতি রয়েছে

উদাহরণস্বরূপ: যদি আপনার খণ্ডের নাম মাইফ্রেগমেন্ট হয়

সুতরাং আপনি ক্রিয়াকলাপ থেকে আপনার খণ্ডকে এভাবে কল করবেন:

getSupportFragmentManager().beginTransaction().add(R.id.container, MyFragment.newInstance("data1","data2"),"MyFragment").commit();

* আর.আইডি.কন্টেইনারটি আমার ফ্রেম-লেআউটের একটি আইডি

সুতরাং মাইফ্রেগমেন্ট.নেইউ ইনস্ট্যান্সে ("ডেটা 1", ​​"ডেটা 2") আপনি খণ্ডগুলিতে ডেটা প্রেরণ করতে পারেন এবং আপনার খণ্ডে আপনি মাইফ্র্যাগমেন্ট নিউআইন্সটেন্সে (স্ট্রিং প্যারাম 1, স্ট্রিং প্যারাম 2) এই ডেটা পাবেন

public static MyFragment newInstance(String param1, String param2) {
        MyFragment fragment = new MyFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

এবং তারপরে খন্ডের অনক্রিট পদ্ধতিতে আপনি ডেটা পাবেন:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

সুতরাং এখন এমপারাম 1 এর ডেটা 1 রয়েছে এবং এমপারাম 2 এর ডেটা 2 রয়েছে

এখন আপনি এই খণ্ডগুলিতে এই এমপারাম 1 এবং এমপ্রাম 2 ব্যবহার করতে পারেন ।


এখানে R.id.container কি? আপনি কি বোঝাতে চেয়েছিলেন R.id.container_c موجودہ এটি একটি অন্তর্গত মান।
শौर্য উৎপল

@ গুলি * আর.আইডি.কন্টেইনার আমার
ফ্রেমলআউট

এখনও অবধি সর্বোত্তম ব্যাখ্যায় আমি ফ্র্যাগমেন্ট ম্যানেজার ব্যবহার করে টুকরা যোগ / প্রতিস্থাপনের ডেটা পাস করতে পেরেছি। রত্নের মতো কাজ করে! ধন্যবাদ!
সাম

আর.আইডি.নাভ_হোস্ট_ফ্রেগমেন্টটি আর.আইডি.কন্টেনারের পরিবর্তে ব্যবহার করেছেন
বাহা হ্যানি

10

আমি নতুনদের যোগ করতে চাই যে এখানে 2 টি সবচেয়ে আপোভেট করা উত্তরের মধ্যে পার্থক্য একটি খণ্ডের বিভিন্ন ব্যবহার দ্বারা দেওয়া হয়েছে।

আপনি যে জাভা শ্রেণীর যে অংশটি পাস করতে চান সেই ডেটা যদি ব্যবহার করেন তবে আপনি ডেটা পাস করার প্রথম উত্তরটি প্রয়োগ করতে পারেন:

Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);

তবে আপনি উদাহরণস্বরূপ ট্যাবড টুকরা জন্য অ্যান্ড্রয়েড স্টুডিও দ্বারা প্রদত্ত ডিফল্ট কোড ব্যবহার করেন, এই কোড কাজ করবে না।

এমনকি আপনি যদি আপনার ফ্রেগমেন্টক্লাসের সাথে ডিফল্ট প্লেসোল্ডারফ্র্যাগমেন্টটি প্রতিস্থাপন করেন এবং এমনকি যদি আপনি ফ্র্যাগমেন্টপাগারএডাপ্টারটিকে নতুন পরিস্থিতিতে সংশোধন করেন তবেও গেটটাইম () এর জন্য একটি স্যুইচ এবং getPageTitle () এর জন্য অন্য একটি স্যুইচ যুক্ত করুন ( এখানে দেখানো হয়েছে )

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

এই পৃষ্ঠাটি থেকে সর্বাধিক আপত্তিযুক্ত উত্তরগুলি কাজ না করার মূল কারণটি হ'ল ট্যাবযুক্ত টুকরাগুলির জন্য সেই ডিফল্ট কোডটিতে টুকরোগুলি অন্য জাভা শ্রেণিতে ব্যবহৃত হয়: ফ্রেগমেন্টপেজার অ্যাডাপ্টার!

সুতরাং, ডেটা প্রেরণ করার জন্য, আপনি মাদারঅ্যাক্টিভিটিতে একটি বান্ডিল তৈরি করতে এবং প্রবন্ধ নং 2 ব্যবহার করে ফ্রেগমেন্টপেজার অ্যাডাপ্টারে পাস করতে প্ররোচিত হন।

কেবল এটি আবার ভুল। ( সম্ভবত আপনি এটি এটি করতে পারেন, তবে এটি কেবল একটি জটিলতা যা সত্যই প্রয়োজন হয় না )।

আমি মনে করি, এটি করার সঠিক / সহজ উপায়টি হ'ল সরাসরি উত্তর নং 2 ব্যবহার করে প্রশ্নটির খণ্ডে ডেটা প্রেরণ করা। হ্যাঁ, ট্যাবযুক্ত খণ্ডগুলির জন্য ক্রিয়াকলাপ এবং টুকরাটির মধ্যে শক্ত সংযোগ থাকবে, কিন্তু এটি প্রত্যাশিত। আমি আপনাকে মাদারঅ্যাক্টিভিটি জাভা ক্লাসের ভিতরে ট্যাবড টুকরো তৈরি করার পরামর্শ দিচ্ছি (সাবক্লাস হিসাবে, তারা মাদারএকটিভিটির বাইরে কখনও ব্যবহার করা হবে না) - এটি সহজ, মাদারএকটিভিটি জাভা ক্লাসের মধ্যে যতগুলি টুকরো দরকার তেমন যোগ করুন:

 public static class Tab1 extends Fragment {

    public Tab1() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
        return rootView;
    }
}.

সুতরাং, মাদারঅ্যাক্টিভিটি থেকে এই জাতীয় খণ্ডটিতে ডেটা প্রেরণ করতে আপনাকে আপনার মাদার ক্রিয়াকলাপের ওঙ্ক্রিটের উপরে ব্যক্তিগত স্ট্রিংস / বান্ডিল তৈরি করতে হবে - যা আপনি টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করে পূরণ করতে পারবেন অনক্রিটের পরে তৈরি পদ্ধতি (এখানে getMyData () নামে পরিচিত)।

public class MotherActivity extends Activity {

    private String out;
    private Bundle results;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mother_activity);

       // for example get a value from the previous activity
        Intent intent = getIntent();
        out = intent.getExtras().getString("Key");

    }

    public Bundle getMyData() {
        Bundle hm = new Bundle();
        hm.putString("val1",out);
        return hm;
    }
}

এবং তারপরে খণ্ড শ্রেণিতে আপনি getMyData ব্যবহার করবেন:

public static class Tab1 extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        public Tab1() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
            TextView output = (TextView)rootView.findViewById(R.id.your_id_for_a_text_view_within_the_layout);

            MotherActivity activity = (MotherActivity)getActivity();

            Bundle results = activity.getMyData();
            String value1 = results.getString("val1");

            output.setText(value1);
            return rootView;
        }
    }

আপনার যদি ডাটাবেস প্রশ্ন থাকে তবে আমি আপনাকে মাদারঅ্যাক্টিভিটিতে এটি করার পরামর্শ দিই (এবং উপরে উল্লিখিত টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো হিসাবে, হিসাবে আপনার স্ট্রিংস / ইন্টিজার হিসাবে একটি বান্ডেলের অভ্যন্তরে কীগুলির সাথে সংযুক্ত হিসাবে তাদের ফলাফলগুলি পাস করুন), আপনার বাক্য গঠন আরও জটিল হয়ে উঠবে (এটি getActivity হয়ে যায় () উদাহরণস্বরূপ, এবং getInttent getActivity ()। getInttent) হয়ে যায়, তবে আপনার ইচ্ছা অনুযায়ী করার বিকল্পও রয়েছে।

নতুনদের জন্য আমার পরামর্শটি ছোট পদক্ষেপগুলিতে মনোনিবেশ করা। প্রথমে, কোনও তথ্য পাস না করে খুব সাধারণ ট্যাবড ক্রিয়াকলাপটি খোলার আপনার অভিপ্রায় পান। এটা কি কাজ করে? এটি আপনি যে ট্যাবগুলি প্রত্যাশা করছেন তা কি খোলে? তা না হলে কেন?

এটি থেকে শুরু করুন এবং এই ক্লিপটিতে উপস্থাপিতগুলির মতো সমাধান প্রয়োগ করে , কী অনুপস্থিত রয়েছে তা দেখুন। সেই নির্দিষ্ট ক্লিপের জন্য, মাইনাসেটিভিটি.এক্সএমএল কখনই প্রদর্শিত হয় না। এটি অবশ্যই আপনাকে বিভ্রান্ত করবে। তবে আপনি যদি মনোযোগ দিন, আপনি দেখতে পাবেন যে উদাহরণস্বরূপ প্রেক্ষাপট (সরঞ্জামসমূহ: প্রসঙ্গ) xML টুকরা ফাইলগুলিতে ভুল। প্রতিটি খণ্ড এক্সএমএলকে সঠিক খণ্ড বিভাগ (বা বিভাজক ব্যবহার করে সাবক্লাস to) নির্দেশ করতে হবে।

আপনি দেখতে পাবেন যে মূল ক্রিয়াকলাপ জাভা শ্রেণিতে আপনাকে ট্যাগলয়েআউট.সেটআপ উইথভিউপ্যাগার (এমভিউপাগার) যুক্ত করতে হবে - ট্যাবলায়আউট ট্যাবলাইআউট = (ট্যাবলআউট) সন্ধানের ভিউবিআইআইডি (আর.আইডি.ট্যাবস) এর ঠিক পরে; এই লাইনটি ছাড়া আপনার দৃষ্টিভঙ্গিটি খণ্ডগুলির এক্সএমএল ফাইলগুলির সাথে লিঙ্কযুক্ত নয়, তবে এটি কেবলমাত্র মূল ক্রিয়াকলাপের এক্সএমএল ফাইলটি দেখায়।

প্রধান ক্রিয়াকলাপ জাভা ক্লাসে লাইন ছাড়াও, প্রধান ক্রিয়াকলাপ এক্সএমএল ফাইলে আপনার অবস্থার সাথে মানিয়ে নিতে আপনাকে ট্যাবগুলি পরিবর্তন করতে হবে (যেমন ট্যাবআইটেমগুলি যুক্ত বা সরাতে)। যদি আপনার প্রধান ক্রিয়াকলাপ এক্সএমএলে ট্যাব না থাকে তবে আপনি সম্ভবত প্রথম স্থানে তৈরি করার সময় সঠিক ক্রিয়াকলাপটি পছন্দ করেন নি (নতুন ক্রিয়াকলাপ - ট্যাবড ক্রিয়াকলাপ)।

দয়া করে নোট করুন যে গত 3 অনুচ্ছেদে আমি ভিডিওটি সম্পর্কে কথা বলি! সুতরাং যখন আমি প্রধান ক্রিয়াকলাপ এক্সএমএল বলি তখন এটি ভিডিওতে প্রধান ক্রিয়াকলাপ XML, যা আপনার পরিস্থিতিতে মাদারঅ্যাক্টিভিটি এক্সএমএল ফাইল।


8

যদি আপনি অ্যাসিঙ্ক কার্যটিতে (কংক্রিটের সাবক্লাসের) টুকরোটির কোনও রেফারেন্স পাস করেন তবে আপনি সরাসরি খণ্ডটি অ্যাক্সেস করতে পারবেন।

অ্যাসিঙ্ক কার্যটিতে টুকরা রেফারেন্সটি পাস করার কিছু উপায়:

  • যদি আপনার অ্যাসিঙ্ক কার্যটি সম্পূর্ণরূপে শ্রেণিবদ্ধ হয় ( class FooTask extends AsyncTask), তবে আপনার খণ্ডটি কনস্ট্রাক্টরে পাস করুন।
  • যদি আপনার অ্যাসিঙ্ক টাস্কটি একটি অভ্যন্তরীণ শ্রেণি হয় তবে কেবলমাত্র অ্যাসিঙ্ক টাস্কটি নির্ধারিত স্কোপে বা বাইরের শ্রেণীর ক্ষেত্র হিসাবে একটি চূড়ান্ত টুকরা ভ্যারিয়েবল ঘোষণা করুন। আপনি অভ্যন্তরীণ শ্রেণী থেকে এটি অ্যাক্সেস করতে সক্ষম হবেন।

আপনার উত্তরটি আমার কাছে যথেষ্ট বৈধ বলে মনে হচ্ছে, আপনি কিছু উদাহরণ কোড দিয়ে কিছুটা আরও বাড়িয়ে দিতে পারেন?
লিওন আর্মস্ট্রং

6

কখনও কখনও আপনি আপনার ক্রিয়াকলাপের জন্য অভিপ্রায় গ্রহণ করতে পারেন এবং আপনার তথ্যটি আপনার কার্যকারী অংশে প্রেরণ করতে হবে।
প্রদত্ত উত্তরগুলি ঠিক আছে যদি আপনি খণ্ডটি শুরু করতে চান তবে এটি এখনও কাজ করে থাকলে setArguments()খুব কার্যকর নয়।
পাস করা তথ্য যদি আপনার ইউআইয়ের সাথে ইন্টারঅ্যাক্ট করার কারণ হয়ে থাকে তবে আর একটি সমস্যা দেখা দেয়। myfragment.passData()সেক্ষেত্রে আপনি এমন কিছু কল করতে পারবেন না কারণ অ্যান্ড্রয়েড দ্রুত বলবে যে কেবল থ্রেড যা দেখিয়েছে তার সাথে যোগাযোগ করতে পারে।

সুতরাং আমার প্রস্তাবটি একটি রিসিভার ব্যবহার করার জন্য। এইভাবে, আপনি ক্রিয়াকলাপ সহ যে কোনও জায়গা থেকে ডেটা প্রেরণ করতে পারেন তবে খণ্ডের প্রসঙ্গে কাজটি করা হবে।

আপনার খণ্ডে onCreate():

protected DataReceiver dataReceiver;
public static final String REC_DATA = "REC_DATA";

@Override
public void onCreate(Bundle savedInstanceState) {


    data Receiver = new DataReceiver();
    intentFilter = new IntentFilter(REC_DATA);

    getActivity().registerReceiver(dataReceiver, intentFilter);
}

private class DataReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        int data= intent.getIntExtra("data", -1);

        // Do anything including interact with your UI
    }
}

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

// somewhere
Intent retIntent = new Intent(RE_DATA);
retIntent.putExtra("data", myData);
sendBroadcast(retIntent);

5

খুব পুরানো পোস্ট, তবুও আমি একটু ব্যাখ্যা যোগ করার সাহস করি যা আমার পক্ষে সহায়ক ছিল।

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

আপনি (যদি আপনি পরীক্ষাগুলি পছন্দ করেন) সহজ পরিস্থিতিতে একটি কার্যনির্বাহ তৈরি করতে পারেন তবে বান্ডিল-অ্যাপ্রোচ কেবল একটি টুকরো এবং এক হাজারের মধ্যে একটি ব্যাকস্ট্যাকের মধ্যে পার্থক্য দেখতে পায় না - এটি সহজ এবং সোজা থাকে।
এজন্যই @ এলেনাসিসের উত্তর হ'ল সবচেয়ে মার্জিত এবং সর্বজনীন সমাধান।
আর সে জন্যই উত্তর দেওয়া সম্ভব @Martin হয়েছে ফাঁদ


4

ক্রিয়াকলাপ শ্রেণি থেকে খণ্ডে ডেটা প্রেরণের জন্য আরও ভাল পদ্ধতি সেটার পদ্ধতিগুলির মধ্য দিয়ে চলেছে। মত

FragmentClass fragmentClass = new FragmentClass();
fragmentClass.setMyList(mylist);
fragmentClass.setMyString(myString);
fragmentClass.setMyMap(myMap);

এবং ক্লাস থেকে এই ডেটাগুলি সহজেই পান।



আপনি যখন অন্যান্য পাশ দিয়েও যাচ্ছেন তখন এটি খুব সুবিধাজনক নয়, পূর্বে অতিরিক্তের সেট করুন
জেরার্ড

আপনার যদি প্রয়োজন হয় যে ডেটা আপনার খণ্ডের কোনও ক্ষেত্রের মধ্যে সেট করা আছে, এবং এটি এখনও দৃশ্যমান নয় (প্রারম্ভিক) আপনি এনপিই পাবেন।
যোজিক


আমি সম্ভবত 3 বছর আগে অ্যান্ড্রয়েডের সাথে কাজ করা বন্ধ করে দিয়েছিলাম, এই জিনিসগুলি এই দিনটিতে অবহেলা করা যেতে পারে।
ssi-anik

4

আপনার কাছ থেকে Activityবান্ডিলের সাথে ডেটা প্রেরণ করুন:

Bundle bundle = new Bundle();
bundle.putString("data", "Data you want to send");

// Your fragment
MyFragment obj = new MyFragment();
obj.setArguments(bundle);

এবং Fragmentঅনক্রিটভিউ পদ্ধতিতে ডেটা পান:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
    String data = getArguments().getString("data");// data which sent from activity  
    return inflater.inflate(R.layout.myfragment, container, false);
}

3

একটি এমন activityএকটি করা প্রয়োজন fragmentআরম্ভের পরে একটি কর্ম সঞ্চালন করা, সবচেয়ে সহজ উপায় হচ্ছে হয় activityএকটি পদ্ধতি ডাকা fragmentউদাহরণস্বরূপ। ইন fragment, একটি পদ্ধতি যুক্ত করুন:

public class DemoFragment extends Fragment {
  public void doSomething(String param) {
      // do something in fragment
  }
}

এবং তারপরে activity, ম্যানেজারটি fragmentব্যবহার করে অ্যাক্সেস পান fragmentএবং কল করুন method:

public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DemoFragment fragmentDemo = (DemoFragment) 
            getSupportFragmentManager().findFragmentById(R.id.fragmentDemo);
        fragmentDemo.doSomething("some param");
    }
}

এবং তারপর activityসাথে সরাসরি যোগাযোগ করতে পারেন fragmentএই আবাহন করার মাধ্যমে method


1
onCreateViewআপনি যে খণ্ডে পদ্ধতিতে প্রবেশ করতে চান না সেই অর্থে এটি সত্যিই দুর্দান্ত । সত্যই সহায়ক ছিল
ইয়ং এমিল

2

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

public interface BundleListener {
    void update(Bundle bundle);
    Bundle getBundle();
}

অথবা ইন্টারফেস ব্যবহার করে দ্বি-মুখী যোগাযোগের জন্য এই জেনেরিক শ্রোতার অনুসরণ করে ব্যবহার করুন

 /**
 * Created by Qamar4P on 10/11/2017.
 */
public interface GenericConnector<T,E> {
    T getData();
    void updateData(E data);
    void connect(GenericConnector<T,E> connector);
}

টুকরা শো পদ্ধতি

public static void show(AppCompatActivity activity) {
        CustomValueDialogFragment dialog = new CustomValueDialogFragment();
        dialog.connector = (GenericConnector) activity;
        dialog.show(activity.getSupportFragmentManager(),"CustomValueDialogFragment");
    }

আপনাকে আপনার কনটেক্সট কাস্ট করতে পারেন GenericConnectorমধ্যে onAttach(Context)খুব

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

CustomValueDialogFragment.show(this);

আপনার খণ্ডে

...
@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        connector.connect(new GenericConnector() {
            @Override
            public Object getData() {
                return null;
            }

            @Override
            public void updateData(Object data) {

            }

            @Override
            public void connect(GenericConnector connector) {

            }
        });
    }
...
    public static void show(AppCompatActivity activity, GenericConnector connector) {
            CustomValueDialogFragment dialog = new CustomValueDialogFragment();
            dialog.connector = connector;
            dialog.show(activity.getSupportFragmentManager(),"CustomValueDialogFragment");
        }

দ্রষ্টব্য: কখনই এর মতো ব্যবহার করবেন না "".toString().toString().toString();


2

এই প্রশ্নটি স্রেফ হোঁচট খেয়েছে, যখন উপরের বেশিরভাগ পদ্ধতিগুলি কাজ করবে। আমি কেবল যুক্ত করতে চাই যে আপনি ইভেন্ট বাস লাইব্রেরিটি ব্যবহার করতে পারেন , বিশেষত এমন পরিস্থিতিতে যেখানে উপাদান (ক্রিয়াকলাপ বা অংশ) তৈরি করা হয়নি, এটি সমস্ত আকারের অ্যান্ড্রয়েড প্রকল্প এবং অনেকগুলি ব্যবহারের ক্ষেত্রে ভাল। আমি ব্যক্তিগতভাবে এটি প্লেস্টোরের বেশ কয়েকটি প্রকল্পে ব্যবহার করেছি।


1

আপনি খণ্ডে পাবলিক স্ট্যাটিক পদ্ধতি তৈরি করতে পারেন যেখানে আপনি সেই খণ্ডটির স্থিতিশীল রেফারেন্স পাবেন এবং তারপরে সেই ফাংশনে ডেটা প্রেরণ করবেন এবং সেই ডেটাটিকে একই পদ্ধতিতে যুক্তিতে সেট করুন এবং টুকরাটির ক্রমবর্ধমান পদ্ধতিতে getArgument এর মাধ্যমে ডেটা পাবেন এবং সেই ডেটা স্থানীয়তে সেট করুন ভেরিয়েবল।


1

টুকরা এবং ক্রিয়াকলাপের মধ্যে ডেটা পাস করার স্মার্টতম চেষ্টা ও পরীক্ষিত পদ্ধতি হ'ল একটি ভেরিয়েবল তৈরি করা, উদাহরণস্বরূপ:

class StorageUtil {
  public static ArrayList<Employee> employees;
}

তারপরে টুকরা থেকে ক্রিয়াকলাপে ডেটা পাস করার জন্য আমরা অ্যাক্টিভিটিক্রিটেড পদ্ধতিতে এটি করি:

//a field created in the sending fragment
ArrayList<Employee> employees;

@Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
         employees=new ArrayList();

       //java 7 and above syntax for arraylist else use employees=new ArrayList<Employee>() for java 6 and below

     //Adding first employee
        Employee employee=new Employee("1","Andrew","Sam","1984-04-10","Male","Ghanaian");
        employees.add(employee);

      //Adding second employee
       Employee employee=new Employee("1","Akuah","Morrison","1984-02-04","Female","Ghanaian");
         employees.add(employee);

        StorageUtil.employees=employees;
    }

এখন আপনি যে কোনও জায়গা থেকে স্টোরেজউটি.এম্পপ্লয়য়েসের মান পেতে পারেন। গুডলাক!


0

আমার সমাধানটি খণ্ডটির অভ্যন্তরে স্থির পদ্ধতি লিখতে হবে:

public TheFragment setData(TheData data) {
    TheFragment tf = new TheFragment();
    tf.data = data;
    return tf;
}

এইভাবে আমি নিশ্চিত যে অন্য যে কোনও সম্ভাব্য ক্রিয়াকলাপের আগে এটির সাথে কাজ করার প্রয়োজন হতে পারে তার আগে আমার সমস্ত ডেটা ফ্রেগমেন্টের মধ্যে রয়েছে। এছাড়াও এটি আমার মতে পরিষ্কার দেখায়।


1
ঠিক আছে, থেডাটা যদি থ্রেড নিরাপদ না হয় তবে এটিকে স্থির করে তোলা অগত্যা আপনাকে থ্রেড সম্পর্কিত সমস্যা থেকে রক্ষা করবে না। সেই সাথে যত্নবান। স্ট্যাটিক প্রকৃতি দ্বারা থ্রেড নিরাপদ নয়।
মার্টিন মার্কনকিনি

0

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

অ্যান্ড্রয়েডের সর্বশেষ বিকাশের ট্রেন্ড অনুসরণ করে সেরা সমাধানটি হল ভিউ মডেল (অ্যান্ড্রয়েড জেটপ্যাকের অংশ) ব্যবহার করে।

অভিভাবক ক্রিয়াকলাপে একটি ভিউমোডেল ক্লাস তৈরি এবং সূচনা করুন, দয়া করে নোট করুন যে এই ভিউমোডেলটিকে ক্রিয়াকলাপ এবং খণ্ডের মধ্যে ভাগ করতে হবে।

এখন, খণ্ডের অনভিউক্রিটেড () এর অভ্যন্তরে, ভিউমোডেল ক্ষেত্রগুলি শোনার জন্য একই ভিউমোডেল এবং সেটআপ পর্যবেক্ষকদের সূচনা করুন।

আপনার যদি প্রয়োজন হয় তবে এখানে একটি সহায়ক, গভীর-টিউটোরিয়াল রয়েছে।

https://medium.com/mindorks/how-to-communicate-between-fragments-and-activity-using-viewmodel-ca733233a51c


-4

আপনার ক্রিয়াকলাপে স্থির পরিবর্তনশীল ঘোষণা করুন

public static HashMap<String,ContactsModal> contactItems=new HashMap<String, ContactsModal>();

তারপরে আপনার খণ্ডে অনুসরণ অনুসরণ করুন

ActivityName.contactItems.put(Number,contactsModal);

এটি কাজ করবে তবে প্রস্তাবিত নয়। স্থির সদস্যরা সাম্প্রতিক অ্যাপ্লিকেশনগুলি থেকে বাধ্যতামূলকভাবে বন্ধ না করা থাকলে মেমরিটিতে থাকবে। সুতরাং এর মতো ক্ষেত্রে আপনার অ্যাপ্লিকেশন জুড়ে অনেক ক্রিয়াকলাপের প্রয়োজন হলে কেবল স্থির সদস্য ব্যবহার করা উচিত।
এম শাবান আলী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.