আমি কীভাবে কোনও খণ্ড এবং এর ধারক ক্রিয়াকলাপের মধ্যে ডেটা পাস করতে পারি? ক্রিয়াকলাপগুলির মধ্যে ক্রিয়াকলাপগুলির মধ্যে ডেটা পাস করার মতো কিছু আছে কি?
আমি এটি পড়েছি, তবে এটি খুব একটা উপকার করতে পারেনি:
আমি কীভাবে কোনও খণ্ড এবং এর ধারক ক্রিয়াকলাপের মধ্যে ডেটা পাস করতে পারি? ক্রিয়াকলাপগুলির মধ্যে ক্রিয়াকলাপগুলির মধ্যে ডেটা পাস করার মতো কিছু আছে কি?
আমি এটি পড়েছি, তবে এটি খুব একটা উপকার করতে পারেনি:
উত্তর:
আপনার খণ্ডে আপনি কল করতে পারেন getActivity()
।
এটি আপনাকে সেই ক্রিয়াকলাপে অ্যাক্সেস দেবে যা খণ্ডটি তৈরি করেছে। সেখান থেকে আপনি অবশ্যই ক্রিয়াকলাপে থাকা কোনও প্রকারের অ্যাকসেসর পদ্ধতিতে কল করতে পারেন।
যেমন getResult()
আপনার ক্রিয়াকলাপে ডাকা একটি পদ্ধতির জন্য :
((MyActivity) getActivity()).getResult();
ইন্টারফেস ব্যবহার করার চেষ্টা করুন।
যে কোনও টুকরোগুলি যাতে ডেটাটি এতে থাকা ক্রিয়াকলাপে ফিরে যেতে পারে সেগুলি ডেটা পরিচালনা ও পাস করার জন্য একটি ইন্টারফেস ঘোষণা করবে declare তারপরে নিশ্চিত হয়ে নিন যে আপনার ধারণিত ক্রিয়াকলাপটি সেই ইন্টারফেস প্রয়োগ করে। উদাহরণ স্বরূপ:
জাভা
আপনার খণ্ডে, ইন্টারফেসটি ঘোষণা করুন ...
public interface OnDataPass {
public void onDataPass(String data);
}
তারপরে, অন্যাটাক পদ্ধতিতে ইন্টারফেসের বিভাজনযুক্ত সংযুক্ত শ্রেণীর প্রয়োগটি সংযুক্ত করুন, এর মতো:
OnDataPass dataPasser;
@Override
public void onAttach(Context context) {
super.onAttach(context);
dataPasser = (OnDataPass) context;
}
আপনার খণ্ডের মধ্যে, যখন আপনাকে ডেটা পাসিং পরিচালনা করতে হবে, কেবল এটি ডেটাপ্যাসার অবজেক্টে কল করুন:
public void passData(String data) {
dataPasser.onDataPass(data);
}
অবশেষে, আপনার সমন্বিত ক্রিয়াকলাপে যা প্রয়োগ করে OnDataPass
...
@Override
public void onDataPass(String data) {
Log.d("LOG","hello " + data);
}
KOTLIN
পদক্ষেপ 1. ইন্টারফেস তৈরি করুন
interface OnDataPass {
fun onDataPass(data: String)
}
পদক্ষেপ ২। তারপরে, অন্টাচ পদ্ধতিতে (আপনারফ্রেগমেন্ট) বিভাজনের সাথে ইন্টারফেসের ধারণামূলক শ্রেণীর প্রয়োগটি সংযুক্ত করুন, এর মতো:
lateinit var dataPasser: OnDataPass
override fun onAttach(context: Context) {
super.onAttach(context)
dataPasser = context as OnDataPass
}
পদক্ষেপ ৩. আপনার খণ্ডের মধ্যে, যখন আপনাকে ডেটা পাসিং পরিচালনা করতে হবে, কেবল এটি ডেটাপ্যাসার অবজেক্টে কল করুন:
fun passData(data: String){
dataPasser.onDataPass(data)
}
পদক্ষেপ 4. অবশেষে, আপনার ক্রিয়াকলাপে অনডেটাপাস প্রয়োগ করে
class MyActivity : AppCompatActivity(), OnDataPass {}
override fun onDataPass(data: String) {
Log.d("LOG","hello " + data)
}
ActionBar.TabListener
এবং একটি অতিরিক্ত ইন্টারফেস যুক্ত করতে হয়েছিল।
সহজ পদ্ধতির তবে প্রস্তাবিত নয়
আপনি খণ্ড থেকে ক্রিয়াকলাপ ডেটা অ্যাক্সেস করতে পারেন:
কার্যক্রম:
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;
}
}
MyActivity
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Bundle b = getActivity().getIntent().getExtras();
wid = b.getString("wid");
rid = b.getString("rid");
View view = inflater.inflate(R.layout.categoryfragment, container, false);
return view;
}
একটি খণ্ড এবং এর ধারক ক্রিয়াকলাপের মধ্যে ডেটা পাস করা
কার্যক্রম:
Bundle bundle = new Bundle();
bundle.putString("message", "Alo Elena!");
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");
...
...
...
}
আমি জানি না এটি সবচেয়ে ভাল উপায় বা না আমি গুগলে বেশ কিছুক্ষণ অনুসন্ধান করে যাচ্ছিলাম যে আমি কীভাবে কোনও বান্ডিলকে কোনও খণ্ড থেকে তার ধারক ক্রিয়াকলাপে পাস করতে পারি তবে আমি যা কিছু পেয়েছি তার পরিবর্তে ক্রিয়াকলাপ থেকে খণ্ডে ডেটা প্রেরণ করছিলাম (যা আমি নবাগত হিসাবে আমার জন্য কিছুটা বিভ্রান্তিকর হয়েছিল)।
পরে আমি আমার নিজস্ব কিছু চেষ্টা করেছি যা আমার জন্য ঠিক যেমন কাজ করেছিল ঠিক তেমনভাবে কাজ করে। সুতরাং আমি এখানে পোস্ট করব আমার মতো কেও একই জিনিসটির সন্ধান করছে।
// টুকরা থেকে ডেটা পাসিং।
Bundle gameData = new Bundle();
gameData.putStringArrayList(Constant.KEY_PLAYERS_ARR,players);
gameData.putString(Constant.KEY_TEAM_NAME,custom_team_name);
gameData.putInt(Constant.KEY_REQUESTED_OVER,requestedOver);
Intent intent = getActivity().getIntent();
intent.putExtras(gameData);
// এটির ধারক ক্রিয়াকলাপ থেকে বান্ডিল থেকে ডেটা নেওয়া।
Bundle gameData = getIntent().getExtras();
if (gameData != null)
{
int over = gameData.getInt(Constant.KEY_REQUESTED_OVER);
ArrayList<String> players = gameData.getStringArrayList(Constant.KEY_PLAYERS_ARR);
String team = gameData.getString(Constant.KEY_TEAM_NAME);
}
else if (gameData == null)
{
Toast.makeText(this, "Bundle is null", Toast.LENGTH_SHORT).show();
}
ইন্টারফেস একটি সেরা সমাধান:
আঠালো ইন্টারফেস:
public interface DataProviderFromActivity {
public String getName();
public String getId);
}
MyActivity:
public class MyActivity implements DataProviderFromActivity{
String name = "Makarov";
String id = "sys533";
... ... ... ... ... .... ....
... ... ... ... ... .... ....
public String getName(){
return name;
};
public String getId(){
return id;
};
}
MyFragment:
public class MyFragment extends Fragment{
String fragName = "";
String fragId = "";
... ... ... ... ... .... ....
... ... ... ... ... .... ....
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
DataProviderFromActivity myActivity= (DataProviderFromActivity) getActivity();
fragName = myActivity.getName();
fragId = myActivity.getId();
... ... ... ... ... .... ....
... ... ... ... ... .... ....
updateFragmentView();
}
}
আমি এমন একটি অ্যাপকম্প্যাটঅ্যাক্টিভিটি ব্যবহার করেছি যা তারিখ শ্রোতাদের প্রয়োগ করে। আমার একটি তারিখের ব্যাপ্তি নির্বাচককে কোড করার প্রয়োজনের ফলে খণ্ডগুলি একটি প্রয়োজনীয়তা হিসাবে আসে। এবং আমার পিতামাতার ক্রিয়াকলাপে ফিরিয়ে আনার জন্য নির্বাচিত তারিখগুলি গ্রহণ করার জন্য আমারও ধারক প্রয়োজন needed
ধারক ক্রিয়াকলাপের জন্য, এটি শ্রেণির ঘোষণা:
public class AppCompatDateRange extends AppCompatActivity implements
DateIniRangeFragment.OnDateIniSelectedListener, DateFimRangeFragment.OnDateFimSelectedListener
এবং কলব্যাকগুলির জন্য ইন্টারফেসগুলি:
@Override
public void onDateIniSelected(String dataIni) {
Log.i("data inicial:", dataIni);
}
@Override
public void onDateFimSelected(String dataFim) {
Log.i("data final:", dataFim);
}
কলব্যাকগুলি স্ট্রিং কারণ তারিখগুলি একটি কোয়েরি নির্বাচনের প্যারাম।
খণ্ডগুলির জন্য কোড (প্রাথমিক তারিখের খণ্ডের ভিত্তিতে):
public class DateIniRangeFragment extends Fragment {
OnDateIniSelectedListener callbackIni;
private DatePicker startDatePicker;
public DateIniRangeFragment() {
///required empty constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
///through this interface the fragment sends data to the container activity
public interface OnDateIniSelectedListener {
void onDateIniSelected(String dataIni);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
///layout for the fragment
View v = inflater.inflate(R.layout.date_ini_fragment, container, false);
///initial date for the picker, in this case, current date
startDatePicker = (DatePicker) v.findViewById(R.id.start_date_picker_appcompat);
Calendar c = Calendar.getInstance();
int ano = c.get(Calendar.YEAR);
int mes = c.get(Calendar.MONTH);
int dia = c.get(Calendar.DAY_OF_MONTH);
startDatePicker.setSpinnersShown(false);
startDatePicker.init(ano, mes, dia, dateSetListener);
return v;
}
///listener that receives the selected date
private DatePicker.OnDateChangedListener dateSetListener = new DatePicker.OnDateChangedListener() {
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
if (view.isShown()) { ///if the datepicker is on the screen
String sDataIni = year + "-" + (monthOfYear + 1) + "-" + dayOfMonth;
callbackIni.onDateIniSelected(sDataIni); //apply date to callback, string format
}
}
};
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
/*
* this function guarantees that the container activity implemented the callback interface
* */
try {
callbackIni = (OnDateIniSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " deve implementar OnDateIniSelectedListener");
}
}
}
ধারক + টুকরা রচনা করতে, আমি কাস্টম ক্লাসের সাথে একটি ভিউপাগার (অ্যাপকম্প্যাট) ব্যবহার করেছি যা ফ্রেগমেন্টপেজারএডাপ্টার প্রসারিত করে। কোনও সংলাপ নেই।
সহজভাবে আপনি ইভেন্টবাস ব্যবহার করতে পারেন এটি সহজ এবং দুর্দান্ত কাজ
ইভেন্ট পদ 3 পদক্ষেপে
ইভেন্টগুলি সংজ্ঞায়িত করুন:
public static class MessageEvent { /* Additional fields if needed */ }
সাবস্ক্রাইবার প্রস্তুত করুন: আপনার সাবস্ক্রাইব করার পদ্ধতিটি ঘোষণা করুন এবং এ্যানোটেট করুন optionচ্ছিকভাবে একটি থ্রেড মোড নির্দিষ্ট করুন:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
নিবন্ধভুক্ত করুন এবং আপনার গ্রাহক নিবন্ধন করুন। অ্যান্ড্রয়েডে উদাহরণস্বরূপ, ক্রিয়াকলাপ এবং টুকরা সাধারণত তাদের জীবনচক্র অনুযায়ী নিবন্ধভুক্ত করা উচিত:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
ইভেন্ট পোস্ট করুন:
EventBus.getDefault().post(new MessageEvent());
আমি জানি এই দেরি হতে পারে। তবে আমিও সবসময় এই প্রশ্নে হারিয়েছি। আমি এই লিঙ্কটি ভাগ করছি ... কারণ এটি সম্ভবত এটিই সবচেয়ে ভাল ব্যাখ্যা যা ওয়েবে আমি এর জন্য খুঁজে পেয়েছি। এটি খণ্ডটিকে ক্রিয়াকলাপে এবং টুকরো টুকরো টুকরোকে সমাধান করে !
public class Fragmentdemo extends Fragment {
public interface onDemoEventListener {
public void demoEvent(String s);
}
onDemoEventListener demoEventListener;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
demoEventListener = (onDemoEventListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement onDemoEventListener");
}
}
final String LOG_TAG = "TAG";
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragmentdemo, null);
Button button = (Button) v.findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
demoEventListener.someEvent("Test text to Fragment1");
}
});
enter code here
return v;
}
}
ধারক ক্রিয়াকলাপের খণ্ডে অন্য ক্রিয়াকলাপ থেকে পাস করে ডেটাগুলি পাওয়ার আরও একটি সহজ উপায়: উদাহরণস্বরূপ:
ক্রিয়াকলাপ_এ => ক্রিয়াকলাপ_বি (খণ্ড)
আপনার ক্রিয়াকলাপ_এ আপনি এমন একটি উদ্দেশ্য তৈরি করেছেন যেমন আপনি অন্য ক্রিয়াকলাপে ডেটা (এখানে স্ট্রিং) প্রেরণ করছেন:
Intent intent = new Intent(getBaseContext(),Activity_B.class);
intent.putExtra("NAME", "Value");
startActivity(intent);
আপনার ক্রিয়াকলাপ_বিতে অন্তর্ভুক্ত আপনার খণ্ডে:
String data = getActivity().getIntent().getExtras();
getBaseContext()
আমাকে নিম্নলিখিত ত্রুটিটি দেয়:The method getBaseContext() is undefined for the type new View.OnClickListener(){}