ক্রিয়াকলাপ থেকে ভগ্নাংশে ভেরিয়েবল কীভাবে পাস করবেন এবং এটিকে আবার পাস করবেন কীভাবে?


135

আমি বর্তমানে একটি অ্যান্ড্রয়েড অ্যাপ তৈরি করছি এবং আমি ক্রিয়াকলাপ এবং খণ্ডের মধ্যে একটি তারিখ পাস করতে চাই। আমার ক্রিয়াকলাপে একটি বোতাম রয়েছে, যা খণ্ডটি খুলবে: তারিখপিকারফ্রেগমেন্ট।

আমার ক্রিয়াকলাপে আমি একটি তারিখ দেখি, যা আমি খণ্ডের সাথে সংশোধন করতে চাই। তাই আমি তারিখটি বেছে নেওয়ার তারিখটি বেছে নিতে চাই এবং এটিকে ক্রিয়াকলাপে ফিরে পাঠাতে চাই।

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


আমার সমস্যাও ঠিক আপনার মতো। আমি অবাক হয়েছি কেন উদাহরণগুলি কেবল খণ্ডগুলিকে তারিখ চয়নকারের "ব্যবহারকারী" হিসাবে বিবেচনা করে, তাদের দ্বারা শুরু করা কার্যকলাপ নয়।
ক্লাদিও

উত্তর:


213

কোনও খণ্ডে তথ্য প্রেরণ করার জন্য , আপনি যখন এটি তৈরি করবেন তখন আপনি অস্থির সেট করে রাখুন এবং পরে আপনার খণ্ডটির ক্রিয়েট বা অনক্রিটভিউ পদ্ধতিতে এই যুক্তিটি পুনরুদ্ধার করতে পারেন।

আপনার টুকরাটির নতুনআইন্স ফাংশনটিতে আপনি যে যুক্তিগুলিতে এটি প্রেরণ করতে চান তা যুক্ত করুন:

/**
 * Create a new instance of DetailsFragment, initialized to
 * show the text at 'index'.
 */
public static DetailsFragment newInstance(int index) {
    DetailsFragment f = new DetailsFragment();
    // Supply index input as an argument.
    Bundle args = new Bundle();
    args.putInt("index", index);
    f.setArguments(args);
    return f;
}

তারপরে পদ্ধতিতে খণ্ডের ভিতরে onCreateবা onCreateViewআপনি এই জাতীয় যুক্তিগুলি পুনরুদ্ধার করতে পারেন:

Bundle args = getArguments();
int index = args.getInt("index", 0);

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

ডকুমেন্টেশন টিউটোরিয়াল:

http://developer.android.com/training/basics/fragments/communicating.html


10
আমি মনে করি এই প্রশ্নটি লোকেদের বারবার জিজ্ঞাসা করার বিষয়টি হ'ল ডকুমেন্টেশনে এটি খুব ভালভাবে ব্যাখ্যা করা হয়নি।
মাইকেল অ্যালান হাফ

1
আমি এখনও কোন পদ্ধতিটি ব্যবহার করা সবচেয়ে উত্তম, তা আপনার বা নীচের উত্তরটি @ এলেনাসিস দ্বারা জবাব দেওয়া নিয়ে এখনও বিভ্রান্ত
যোয়ান হারকিউট

আর্কিটেকচার উপাদানগুলি (আই / ও '17) ব্যবহার করে টুকরাগুলির মধ্যে ডেটা ভাগ করার একটি নতুন উপায় রয়েছে: ডেভেলপার.অ্যান্ড্রয়েড
টপিক

এক্সএমএল লেআউটের ভিতরে তৈরি হওয়া সেই খণ্ডগুলি কীভাবে?
রাল্ফগ্যাব

আমি আর স্ট্যাটিক পদ্ধতি ব্যবহার করতে চাই না।
আহমাদুল্লাহ সৈকত

89

থেকে তথ্য পাঠানো হচ্ছে Activityএকটি থেকেFragment

কার্যক্রম:

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) {
    String myValue = this.getArguments().getString("message");
    ...
    ...
    ...
}

তবে আপনি যদি খণ্ড থেকে ক্রিয়াকলাপে মান প্রেরণ করতে চান, jpardogo এর উত্তরটি পড়ুন, আপনার অবশ্যই ইন্টারফেসের প্রয়োজন, আরও তথ্য: অন্যান্য খণ্ডগুলির সাথে যোগাযোগ করা


2
কিভাবে একটি কাস্টম অবজেক্ট পাস? আমি ব্যবহার করেছি Parcelableতবে তা আমাকে দিয়েছেclass cast exception
ভাইপার

এই সমাধানটি আমার পক্ষে কাজ করছে না, কোথা থেকে লেনদেন আমদানি করতে পারি তা খুঁজে পাচ্ছি না
theBIBIcounter

আপনি যদি আপনার ক্রিয়াকলাপে খণ্ডটি লোড করেন তবে আপনি আপনার লেনদেনে সংজ্ঞায়িত বান্ডেলের মাধ্যমে মানগুলি প্রেরণ করতে পারেন। আপনার পরিস্থিতি কি ব্যাখ্যা করুন?
জর্জেসিস

8

@ ρяσѕρєя কে এবং টেরিকে ধন্যবাদ ... এটি আমাকে অনেক সাহায্য করে এবং পুরোপুরি কাজ করে

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

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) {
    // get arguments
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}

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


7

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

https://github.com/greenrobot/EventBus


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

2

সেখানে থাকা সমস্ত কোটলিন বিকাশকারীদের জন্য:

আপনার ফ্রেগমেন্টে ডেটা প্রেরণের জন্য অ্যান্ড্রয়েড স্টুডিও প্রস্তাবিত সমাধানটি (= আপনি যখন ফাইল -> নতুন -> খণ্ড -> খণ্ড) (ফাঁকা) দিয়ে একটি ফাঁকা-খণ্ড তৈরি করেন এবং আপনি "খণ্ড কারখানার পদ্ধতিগুলি অন্তর্ভুক্ত করেন" পরীক্ষা করে দেখুন)।

এটি আপনার খণ্ডে রাখুন:

class MyFragment: Fragment {

...

    companion object {

            @JvmStatic
            fun newInstance(isMyBoolean: Boolean) = MyFragment().apply {
                arguments = Bundle().apply {
                    putBoolean("REPLACE WITH A STRING CONSTANT", isMyBoolean)
                }
            }
     }
}

.applyকোনও অবজেক্ট তৈরি হওয়ার সময় ডেটা সেট করার একটি দুর্দান্ত কৌশল বা তারা এখানে বর্ণিত হিসাবে :

নির্দিষ্ট ফাংশন [ব্লক ]টিকে thisতার প্রাপক হিসাবে মূল্য হিসাবে কল করে এবং thisমানটি প্রদান করে।

তারপরে আপনার ক্রিয়াকলাপ বা খণ্ডনগুলিতে করুন:

val fragment = MyFragment.newInstance(false)
... // transaction stuff happening here

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

private var isMyBoolean = false

override fun onAttach(context: Context?) {
    super.onAttach(context)
    arguments?.getBoolean("REPLACE WITH A STRING CONSTANT")?.let {
        isMyBoolean = it
    }
}

আপনার ক্রিয়াকলাপে ডেটা "প্রেরণ" করতে, আপনার ক্রিয়াকলাপে কেবল কোনও ফাংশন সংজ্ঞায়িত করুন এবং আপনার খণ্ডে নিম্নলিখিতটি করুন:

(activity as? YourActivityClass)?.callYourFunctionLikeThis(date) // your function will not be called if your Activity is null or is a different Class

কোটলিনের যাদু উপভোগ করুন!


1

এক্সএমএল দ্বারা লিঙ্কযুক্ত টুকরাগুলিতে ক্রিয়াকলাপ থেকে ডেটা প্রেরণ

যদি আপনি অ্যান্ড্রয়েড স্টুডিওতে টেমপ্লেটগুলির মধ্যে একটি যেমন ফাইল> নতুন> টুকরা> টুকরা (তালিকা) ব্যবহার করে একটি খণ্ড তৈরি করেন তবে খণ্ডটি এক্সএমএল এর মাধ্যমে সংযুক্ত করা হয়েছে। নতুন ইনস্ট্যান্স পদ্ধতিটি খণ্ডে তৈরি করা হয়েছে তবে কখনও আখ্যায়িত হয় না তাই আর্গুমেন্টগুলি পাস করতে ব্যবহার করা যায় না।

ক্রিয়াকলাপের পরিবর্তে অ্যাটাকফ্রেগমেন্টটিতে পদ্ধতিটি ওভাররাইড করে

@Override
public void onAttachFragment(Fragment fragment) {
    if (fragment instanceof DetailsFragment) {
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);        
     }
}

তারপরে অন্যান্য উত্তরগুলি অনুসারে টুকরা অনক্রিট পদ্ধতিতে যুক্তিগুলি পড়ুন


0

আপনি কেবল একটি বান্ডিল দিয়ে নিজের খণ্ডটি ইনস্ট্যান্ট করতে পারেন:

Fragment fragment = Fragment.instantiate(this, RolesTeamsListFragment.class.getName(), bundle);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.