निम्नलिखित कोड के साथ मैं एक खंड (टुकड़ा ए) से एक मुख्य गतिविधि में एक स्ट्रिंग भेजने के लिए एक बटन पर क्लिक कर सकता हूं। मैं मुख्य गतिविधि से स्ट्रिंग को कैसे पुनर्प्राप्त करूं और इसे एक ही बार में एक खंड बी पर प्रदर्शित करूं? मैं चाहता हूं कि टुकड़े सिंक्रनाइज़ किए गए कार्य करें; जैसे ही मैं फ्रैगमेंट ए में बटन क्लिक करता हूं, फ्रैगमेंट बी अपडेट हो जाता है। मुझे इस पर एसओ में कुछ भी नहीं मिल रहा है।

इंटरफेस:

public interface OnDataListener {
    public void onDataReceived(String data);
}

टुकड़ा एक डेटा श्रोता:

OnDataListener mOnDataListener;

@Override
public void onAttach(Context context) {
    try{
        mOnDataListener = (OnDataListener) context;
        Log.d(TAG, "onAttach was called" + context);
    }catch (ClassCastException e){
        Log.e(TAG, "onAttach: ClassCastException: " + e.getMessage() );
    }
    super.onAttach(context);
}

फ्रैगमेंट ए के ऑनक्रेट व्यू में बटन तर्क:

button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

          String newTextString = editTextView.getText().toString();
          mOnDataListener.onDataReceived(newTextString);

        }
      });

मुख्य गतिविधि डेटा रिसीवर

public class MainActivity extends AppCompatActivity implements OnDataListener {


@Override
public void onDataReceived(String data) {

    Log.e(TAG, "MainActivity received this string " + data );

            }
}
0
Bread 22 फरवरी 2019, 08:03

2 जवाब

सबसे बढ़िया उत्तर

समाधान 1: कॉलबैक का उपयोग करना

//यह काम करेगा यदि आपका टुकड़ा उदाहरण सक्रिय है तो व्यूपेजर ऑफस्क्रीनपेज सीमा की जांच करें

(आप फरीद हक द्वारा उल्लिखित समाधान 3 का भी उपयोग कर सकते हैं, जो स्वयं गतिविधि का कार्य करके ऐसा ही करते हैं)

यहां, गतिविधि कॉलबैक लागू करती है OnDataUpdateListener

interface OnDataUpdateListener{
    void passDataToFragmentB(String data)
}

गतिविधि कोड:

Fragment instanceFragmentB;
// intialise it somewhere in your activity
// or get from viewpager adapter

@Override
void passDataToFragmentB(String data){
    instanceFragmentB.onDataChange(data)
}

टुकड़ा एक कोड:

OnDataUpdateListener mOnDataUpdateListener;
onAttach(Activity activity){
    mOnDataUpdateListener=  (OnDataUpdateListener) activity
}

onViewCreated(){
    somebutton.onClick{
        mOnDataUpdateListener.passDataToFragmentB("someString")
    }
}

टुकड़ा बी कोड:

onDataChange(String data){
    //do your work with update data passed from fragment A  
}

समाधान 2: EventBus या RxBus का उपयोग करना

//यह काम करेगा यदि आपका टुकड़ा उदाहरण सक्रिय है तो व्यूपेजर ऑफस्क्रीनपेज सीमा की जांच करें

ईवेंट या rxbus का उपयोग करते हुए, बस पर नया अद्यतन मान पोस्ट करें और उसी मान प्रकार को देखते हुए गंतव्य खंड बनाएं।

टुकड़ा ए:

onViewCreated(){
    somebutton.onClick{
        EventBus.post("your data")
    }
}

टुकड़ा बी:

@Subsribe
void onDataChange(String data){
    //do your work with update data passed from fragment A  
}

समाधान 3: ViewModel का उपयोग करना।

सभी टुकड़ों में गतिविधि के संदर्भ के साथ व्यूमॉडल लें और LiveData के साथ स्ट्रिंग लपेटें।

जब भी, स्ट्रिंग डेटा बदला जाता है, बस स्ट्रिंग लाइवडेटा ऑब्जेक्ट पर नया डेटा पोस्ट करें। सभी अंश यह देखते हुए कि livedata को अद्यतन मूल्य मिलेगा।

1
bhumik 22 फरवरी 2019, 08:56

समाधान 1

आपकी मुख्य गतिविधि में

@Override
public void onDataReceived(String data) {
   Log.e(TAG, "MainActivity received this string " + data );
   Bundle bundle = new Bundle();
   bundle.putString("edttext", data);
   FragmentB fragment = new FragmentB();
   fragment.setArguments(bundle);
   // Fragment Transaction method goes here
}

अपने FragmentB में डेटा पुनर्प्राप्त करें

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

समाधान २

आप कॉलबैक डेटा को अपने वैश्विक चर में डाल सकते हैं और onClickListerner के समय इसे खंड लेनदेन में उपयोग कर सकते हैं।

समाधान 3

ए) अपने FragmentB में विधि बनाएं

public void changeText (String data) {
   textview.setText(data)
 }

बी) और मेनएक्टिविटी से पास वैल्यू

@Override
public void onDataReceived (String data) {
    myInterface.CallBack("Callbacked when onCreate method Created" + data);
    Log.d("Tiggered", "respond: ");
    FragmentManager manager = getFragmentManager();
    FragmentB fragmentB = (FragmentB) manager.findFragmentById(R.id.id_fragmentB);
    fragmentB.changeText(data);
}
1
Farid Haq 22 फरवरी 2019, 08:23