খণ্ডগুলির মধ্যে কীভাবে মানগুলি পাস করবেন


109

আমি টুকরোগুলি ব্যবহার করতে বেশ নতুন।

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

আমি প্রথম খণ্ড থেকে এর ক্রিয়াকলাপে এবং তার পরে সেই ক্রিয়াকলাপ থেকে দ্বিতীয় ক্রিয়াকলাপে মানটি পাঠাতে সক্ষম হয়েছি। এখন আমি দ্বিতীয় খণ্ডের মধ্যে কীভাবে এই মানটি ব্যবহার করব।

এখানে জাভা কোড :::

package com.example.fragmentexample;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Fragment_1 extends Fragment{

    OnFragmentChangedListener mCallback;

    // Container Activity must implement this interface
    public interface OnFragmentChangedListener {
        public void onButtonClicked(String name);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnFragmentChangedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub      

        View view = inflater.inflate(R.layout.fragment_fragment_1, container, false);

        final EditText edtxtPersonName_Fragment = (EditText) view.findViewById(R.id.edtxtPersonName);
        Button btnSayHi_Fragment = (Button) view.findViewById(R.id.btnSayHi);

        btnSayHi_Fragment.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                String name = edtxtPersonName_Fragment.getText().toString();

                FragmentManager fm = getFragmentManager();
                Fragment_2 f2 = (Fragment_2) fm.findFragmentById(R.id.fragment_content_2);

                Activity activity = getActivity();

                if(activity != null)
                {
                    Toast.makeText(activity, "Say&ing Hi in Progress...", Toast.LENGTH_LONG).show();
                }


                if(f2 != null && f2.isInLayout())
                {
                    f2.setName(name);
                }
                else
                {
                    mCallback.onButtonClicked(name);
                }
            }
        });

        return view;


    }

}

MainActivity.Java

package com.example.fragmentexample;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;

import android.view.Choreographer.FrameCallback;
import android.view.Menu;

public class MainActivity extends Activity implements Fragment_1.OnFragmentChangedListener {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    public void onButtonClicked(String name) {
        // TODO Auto-generated method stub

        Intent i = new Intent(this, SecondActivity.class);
        i.putExtra("", name);
        startActivity(i);
    }

}

SecondActivity.Java

package com.example.fragmentexample;

import android.app.Activity;
import android.os.Bundle;

public class SecondActivity extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_second);

        Bundle b = getIntent().getExtras();

        Fragment_2 f2 = new Fragment_2();
        f2.setArguments(b);
    }
}

Fragment_2.Java

package com.example.fragmentexample;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class Fragment_2 extends Fragment{

    View view;
    TextView txtName;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        view = inflater.inflate(R.layout.fragment_fragment_2, container, false);

            // Exception at this line
        String name = getArguments().getString("message");
        txtName = (TextView) view.findViewById(R.id.txtViewResult);
        txtName.setText(name);

        return view;
    }

    @Override
    public void onAttach(Activity activity) {
        // TODO Auto-generated method stub
        super.onAttach(activity);       
    }

    public void setName(String name)
    {   
        txtName.setText("Hi " + name);
    }

}

আমি নিম্নলিখিত ব্যতিক্রম পেয়েছি :::

04-16 18:10:24.573: E/AndroidRuntime(713): FATAL EXCEPTION: main
04-16 18:10:24.573: E/AndroidRuntime(713): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.fragmentexample/com.example.fragmentexample.SecondActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.ActivityThread.access$500(ActivityThread.java:122)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.os.Looper.loop(Looper.java:132)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.ActivityThread.main(ActivityThread.java:4123)
04-16 18:10:24.573: E/AndroidRuntime(713):  at java.lang.reflect.Method.invokeNative(Native Method)
04-16 18:10:24.573: E/AndroidRuntime(713):  at java.lang.reflect.Method.invoke(Method.java:491)
04-16 18:10:24.573: E/AndroidRuntime(713):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
04-16 18:10:24.573: E/AndroidRuntime(713):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
04-16 18:10:24.573: E/AndroidRuntime(713):  at dalvik.system.NativeStart.main(Native Method)
04-16 18:10:24.573: E/AndroidRuntime(713): Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:724)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.view.LayoutInflater.inflate(LayoutInflater.java:391)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.view.LayoutInflater.inflate(LayoutInflater.java:347)
04-16 18:10:24.573: E/AndroidRuntime(713):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:223)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.Activity.setContentView(Activity.java:1786)
04-16 18:10:24.573: E/AndroidRuntime(713):  at com.example.fragmentexample.SecondActivity.onCreate(SecondActivity.java:13)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.Activity.performCreate(Activity.java:4397)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)
04-16 18:10:24.573: E/AndroidRuntime(713):  ... 11 more
04-16 18:10:24.573: E/AndroidRuntime(713): Caused by: java.lang.NullPointerException
04-16 18:10:24.573: E/AndroidRuntime(713):  at com.example.fragmentexample.Fragment_2.onCreateView(Fragment_2.java:24)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:754)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:956)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1035)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.Activity.onCreateView(Activity.java:4177)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:664)
04-16 18:10:24.573: E/AndroidRuntime(713):  ... 21 more

আমি কীভাবে সেকেন্ডএসিটিভিটি.জভাতে বান্ডিল থেকে ফ্রেগমেন্ট_2. জাভা পেতে পারি?


রুটি যে অংশে সমস্যা পাচ্ছে সে অংশটি হাইলাইট করুন
নিখিল অগ্রওয়াল

সহজ উপায়ে সমাধান সমাধান: স্ট্যাকওভারফ্লো.com
আদিল সিদ্দিকী

উত্তর:


203

পদক্ষেপ 1। ক্রমাংশ থেকে ক্রিয়াকলাপে ডেটা প্রেরণ করতে

Intent intent = new Intent(getActivity().getBaseContext(),
                        TargetActivity.class);
                intent.putExtra("message", message);
                getActivity().startActivity(intent);

পদক্ষেপ 2। ক্রিয়াকলাপে এই ডেটা পাওয়ার জন্য:

Intent intent = getIntent();
String message = intent.getStringExtra("message");

পদক্ষেপ 3 । ক্রিয়াকলাপ থেকে অন্য ক্রিয়াকলাপে ডেটা প্রেরণ করতে স্বাভাবিক পদ্ধতির অনুসরণ করুন

Intent intent = new Intent(MainActivity.this,
                        TargetActivity.class);
                intent.putExtra("message", message);
                startActivity(intent);

ক্রিয়াকলাপে এই ডেটাটি পাওয়ার জন্য পদক্ষেপ 4

     Intent intent = getIntent();
  String message = intent.getStringExtra("message");

পদক্ষেপ ৫. ক্রিয়াকলাপ থেকে আপনি ফ্রেগমেন্টে ডেটা প্রেরণ করতে পারেন যেমন:

Bundle bundle=new Bundle();
bundle.putString("message", "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("message");

    return inflater.inflate(R.layout.fragment, container, false);
    }

2
আমি পদক্ষেপ 5 চেষ্টা করেছিলাম, আমি খণ্ডগুলি থেকে তালিকাগুলি কল করছি এবং সেই ক্রিয়াকলাপ থেকে আইটেমটি নির্বাচন করার পরে, আমি নির্বাচিত ফাইলের নাম সহ খণ্ডে ফিরে আসতে চাই। তবে এটি কাজ করছে না, এটি আমাকে অনক্রিটভিউতে নলপয়েন্টার ব্যতিক্রম দেয়। এই কোন সমাধান দয়া করে? এটা আমার প্রশ্ন হল stackoverflow.com/questions/18208771/...
OnkarDhane

আমি এখানে কীভাবে পজো রাখব? bundle.putString("message", "From Activity");
jeet.chanchawat

31
এইরকম কিছু করার কারণে কীভাবে দোষী হওয়ার কারণে কেউ বিরক্ত হন
এড লি

1
ঠিক এডি, এটি সঠিক উপায় নয়। ধারক ক্রিয়াকলাপের মাধ্যমে টুকরাগুলির মধ্যে যোগাযোগের জন্য তাদের ইন্টারফেস ব্যবহার করা উচিত।
কাব্যেশ কানওয়াল

টুকরাগুলির মধ্যে যোগাযোগের জন্য ইন্টারফেসগুলি ব্যবহার সম্পর্কে: ডেভেলপার.আ্যান্ড্রয়েড
আন্দ্রে এল টরেস

49

বিকাশকারী সাইটে উল্লিখিত হিসাবে

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

টুকরাগুলির মধ্যে যোগাযোগ সম্পর্কিত ক্রিয়াকলাপের মাধ্যমে করা উচিত।

আসুন নিম্নলিখিত উপাদানগুলি রাখুন:

একটি ক্রিয়াকলাপ টুকরা হোস্ট করে এবং টুকরো যোগাযোগের অনুমতি দেয়

ফ্র্যাগমেন্টএ প্রথম টুকরা যা ডেটা প্রেরণ করবে

ফ্র্যাগমেন্টবি-র দ্বিতীয় খণ্ড যা ফ্রেগমেন্টএ থেকে ডেটা পাবেন

ফ্র্যাগমেন্টএ এর বাস্তবায়ন হ'ল:

public class FragmentA extends Fragment 
{
    DataPassListener mCallback;
    
    public interface DataPassListener{
        public void passData(String data);
    }

    @Override
    public void onAttach(Context context) 
    {
        super.onAttach(context);
        // This makes sure that the host activity has implemented the callback interface
        // If not, it throws an exception
        try 
        {
            mCallback = (OnImageClickListener) context;
        }
        catch (ClassCastException e) 
        {
            throw new ClassCastException(context.toString()+ " must implement OnImageClickListener");
        }
    }
    
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
    {
        // Suppose that when a button clicked second FragmentB will be inflated
        // some data on FragmentA will pass FragmentB
        // Button passDataButton = (Button).........
        
        passDataButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (view.getId() == R.id.passDataButton) {
                    mCallback.passData("Text to pass FragmentB");
                }
            }
        });
    }
}

মূল কার্যকলাপ বাস্তবায়ন:

public class MainActivity extends ActionBarActivity implements DataPassListener{
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        if (findViewById(R.id.container) != null) {
            if (savedInstanceState != null) {
                return;
            }
            getFragmentManager().beginTransaction()
                    .add(R.id.container, new FragmentA()).commit();
        }
    }
    
    @Override
    public void passData(String data) {
        FragmentB fragmentB = new FragmentB ();
        Bundle args = new Bundle();
        args.putString(FragmentB.DATA_RECEIVE, data);
        fragmentB .setArguments(args);
        getFragmentManager().beginTransaction()
            .replace(R.id.container, fragmentB )
            .commit();
    }
}

ফ্র্যাগমেন্টবি বাস্তবায়ন হ'ল:

public class FragmentB extends Fragment{
    final static String DATA_RECEIVE = "data_receive";
    TextView showReceivedData;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_B, container, false);
        showReceivedData = (TextView) view.findViewById(R.id.showReceivedData);
    }
    
    @Override
    public void onStart() {
        super.onStart();
        Bundle args = getArguments();
        if (args != null) {
            showReceivedData.setText(args.getString(DATA_RECEIVE));
        }
    }
}

আমি আশা করি এটি সাহায্য করবে ..


4
এখানে অনিমেজক্লিকলিস্টার কী? এবং এটি কীভাবে ডেটাপাসলিস্টনার ভেরিয়েবলে কাস্ট করা হয়?
হর্ষ

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

44

// ফ্রেগমেন্ট_1. জাভাতে

Bundle bundle = new Bundle();
bundle.putString("key","abc"); // Put anything what you want

Fragment_2 fragment2 = new Fragment_2();
fragment2.setArguments(bundle);

getFragmentManager()
      .beginTransaction()
      .replace(R.id.content, fragment2)
      .commit();

// ফ্রেগমেন্ট_2. জাভাতে

Bundle bundle = this.getArguments();

if(bundle != null){
     // handle your code here.
}

আশা করি এটি আপনাকে সহায়তা করবে।


1
মূল পয়েন্টটি দেখানোর জন্য পরিষ্কার উত্তর। putString(বা putInt) ব্যবহার করা উত্তর!
মেহেদী দেহঘানি

22

বিকাশকারীদের ওয়েবসাইট থেকে :

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

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

দয়া করে এই লিঙ্কটিও দেখুন।


আপনি যে দ্বিতীয় লিঙ্কটি দিয়েছেন তা দেখায় যে টুকরা যখন একই ক্রিয়াকলাপে থাকে তখন কীভাবে যোগাযোগ করতে হয়। দু'জনই আলাদা ক্রিয়াকলাপে থাকাকালীন আমি কীভাবে যোগাযোগ করব?
বংশী চাল্লা

5

প্রথমে সমস্ত উত্তর সঠিক, আপনি কাস্টম অবজেক্টগুলি বাদ দিয়ে ডেটা পাস করতে পারেন Intent। আপনি যদি কাস্টম অবজেক্টগুলি পাস করতে চান তবে আপনাকে প্রয়োগ করতে হবে Serialazableবা Parcelableআপনার কাস্টম অবজেক্ট শ্রেণিতে। আমি ভেবেছিলাম এটি অনেক জটিল ...

সুতরাং আপনার প্রকল্পটি যদি সহজ হয় তবে ব্যবহার করার চেষ্টা করুন DataCache। এটি ডেটা পাস করার জন্য দুর্দান্ত সহজ উপায় সরবরাহ করে। রেফ: গিথুব প্রকল্প ক্যাশেপট

1- এটি দেখার বা ক্রিয়াকলাপ বা খণ্ডে সেট করুন যা ডেটা প্রেরণ করবে

DataCache.getInstance().push(obj);

2- নীচের মত কোথাও ডেটা পান

public class MainFragment extends Fragment
{
    private YourObject obj;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        obj = DataCache.getInstance().pop(YourObject.class);

    }//end onCreate()
}//end class MainFragment

ভিতরে স্ট্যাটিক মান সহ একটি অতিরিক্ত শ্রেণি ব্যবহার করা কি সহজ হবে না? এই মানগুলি তখন উভয় টুকরা দ্বারা অ্যাক্সেস করা যায়, তাই কাস্টম অবজেক্টগুলিকে ক্যাশে করার জন্য অতিরিক্ত লাইব্রেরি ব্যবহার করার দরকার নেই।
নেফ

4

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

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

এখানে সম্পূর্ণ উদাহরণ http://www.zoftino.com/passing-data-between-android-frations-used-viewmodel


3

টুকরো টুকরো মধ্যে বিতর্ক পাস। এই প্রশ্নের উত্তর দিতে বেশ দেরি হলেও এটি কাউকে সাহায্য করতে পারে! Fragment_1.java

Bundle i = new Bundle(); 
            i.putString("name", "Emmanuel");

            Fragment_1 frag = new Fragment_1();
            frag.setArguments(i);
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.content_frame
                            , new Fragment_2())
                    .commit();

তারপর আপনার Fragment_2.javaআপনি আপনার মধ্যে স্বাভাবিকভাবে paramaters পেতে পারেন onActivityCreated যেমন

 Intent intent = getActivity().getIntent();
    if (intent.getExtras() != null) {
        String name =intent.getStringExtra("name");
    }

3

আমি মনে করি এই সমস্যাটি সমাধান করার একটি ভাল উপায় হ'ল একটি কাস্টম ইন্টারফেস ব্যবহার করা।

বলুন আপনার দুটি টুকরো (A এবং B) রয়েছে যা একই ক্রিয়াকলাপের মধ্যে রয়েছে এবং আপনি এ থেকে বি তে ডেটা প্রেরণ করতে চান Le

ইন্টারফেস :

public interface OnDataSentListener{
    void onDataSent(Object data);
}

কার্যক্রম:

    public class MyActivity extends AppCompatActivity{

            private OnDataSentListener onDataSentListener;

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

                FragmentTransaction trans = getFragmentManager().beginTransaction();

                FragmentA fa = new FragmentA();
                FragmentB fb = new FragmentB();

               fa.setOnDataSentListener(new Listeners.OnDataSentListener() {
                    @Override
                    public void onDataSent(Object data) {
                         if(onDataSentListener != null)  onDataSentListener.onDataSent(data);
                    }
               });

                transaction.add(R.id.frame_a, fa);
                transaction.add(R.id.frame_b, fb);

                transaction.commit();
            }

            public void setOnDataSentListener(OnDataSentListener listener){
                this.onDataSentListener = listener;
            }
        }

খণ্ড A:

public class FragmentA extends Fragment{

    private OnDataSentListener onDataSentListener;

    private void sendDataToFragmentB(Object data){
        if(onDataSentListener != null) onDataSentListener.onDataSent(data);
    }

    public void setOnDataSentListener(OnDataSentListener listener){
        this.onDataSentListener = listener;
    }
}

খণ্ড বি:

public class FragmentB extends Fragment{

    private void initReceiver(){
        ((MyActivity) getActivity()).setOnDataSentListener(new OnDataSentListener() {
            @Override
            public void onDataSent(Object data) {
                //Here you receive the data from fragment A
            }
        });
    }
}

2

খণ্ডগুলির মধ্যে যোগাযোগ করা মোটামুটি জটিল (শ্রোতার ধারণাটি বাস্তবায়নের জন্য আমি কিছুটা চ্যালেঞ্জিং পাই)।

এই যোগাযোগগুলি বিমূর্ত করতে একটি 'ইভেন্ট বাস' ব্যবহার করা সাধারণ। এটি একটি তৃতীয় পক্ষের গ্রন্থাগার যা আপনার জন্য এই যোগাযোগের যত্ন নেয়।

'অটো' এমন একটি যা এটি প্রায়শই ব্যবহৃত হয় এবং এটি দেখার জন্য উপযুক্ত হতে পারে: http://square.github.io/otto/


2

ফ্র্যাগমেন্ট থেকে অন্য একটি খণ্ডে ডেটা পাঠানো

  • প্রথম খণ্ড থেকে

    // Set data to pass
    MyFragment fragment = new MyFragment(); //Your Fragment
    Bundle bundle = new Bundle();
    bundle.putInt("year", 2017)  // Key, value
    fragment.setArguments(bundle); 
    // Pass data to other Fragment
    getFragmentManager()
     .beginTransaction()
     .replace(R.id.content, fragment)
     .commit(); 
  • দ্বিতীয় খণ্ডে

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
    
         Bundle bundle = this.getArguments();
         if (bundle != null) {
             Int receivedYear = bundle.getInt("year", ""); // Key, default value
         } 
    }

1

এই সাধারণ প্রয়োগটি একটি সহজ উপায়ে টুকরাগুলির মধ্যে ডেটা পাস করতে সহায়তা করে। ভাবেন আপনি 'ফ্র্যাগমেন্ট 1' থেকে 'ফ্রেগমেন্ট 2' তে ডেটা পাস করতে চান

খণ্ড 1 এ (প্রেরণের জন্য ডেটা সেট করুন)

 Bundle bundle = new Bundle();
 bundle.putString("key","Jhon Doe"); // set your parameteres

 Fragment2 nextFragment = new Fragment2();
 nextFragment.setArguments(bundle);

 FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
 fragmentManager.beginTransaction().replace(R.id.content_drawer, nextFragment).commit();

ফ্রেগমেন্ট 2 অনক্রিটভিউ পদ্ধতিতে (প্যারামিটারগুলি পান)

String value = this.getArguments().getString("key");//get your parameters
Toast.makeText(getActivity(), value+" ", Toast.LENGTH_LONG).show();//show data in tost

আমার অ্যাপ্লিকেশনটিতে, আমি এই কাজটি করার চেষ্টা করছি তবে কোনওভাবে যদিও মানটি পাস করা হচ্ছে এটি খণ্ড 2 এ প্রদর্শিত হচ্ছে না, আমি মনে করি যে আমি আর.আইডি.কন্টেন্ট_ড্রেয়ার সেট করতে ভুল করছি। কেউ কি আমাকে নির্দেশ দিতে পারে যে .xML উদাহরণ সহ R.id.content_drawer এর সঠিক সনাক্তকারী হতে পারে।
ফ্যালকন

1

কোটলিন উপায়

SharedViewModelঅফিসিয়াল ভিউমোডেল ডকুমেন্টেশনে প্রস্তাবিত ব্যবহার করুন

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

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

আপনার ভিউমোডেলটিকে আরও সহজে ইনস্ট্যান্ট করতে প্রথমে টুকরা-কেটিএক্স প্রয়োগ করুন

dependencies {
    implementation "androidx.fragment:fragment-ktx:1.2.2"
} 

তারপরে, আপনাকে অন্য ভগ্নাংশের সাথে ভাগ করা হবে এমন ডেটাটি ভিউ মডেলের ভিতরে রাখতে হবে

class SharedViewModel : ViewModel() {
    val selected = MutableLiveData<Item>()

    fun select(item: Item) {
        selected.value = item
    }
}

তারপরে, শেষ করতে, প্রতিটি খণ্ডে কেবলমাত্র আপনার ভিউমোডেলটি ইনস্ট্যান্ট করুন এবং এর মান সেট করুন selected আপনি ডেটা সেট করতে চান সেই খণ্ডটি থেকে নির্ধারণ করুন

খণ্ড খ

class MasterFragment : Fragment() {

    private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        itemSelector.setOnClickListener { item ->
        model.select(item)
      }

    }
}

এবং তারপরে আপনার ভগ্নাংশ গন্তব্যটিতে কেবল এই মানটির জন্য শুনুন

খণ্ড খ

 class DetailFragment : Fragment() {

        private val model: SharedViewModel by activityViewModels()

        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            model.selected.observe(viewLifecycleOwner, Observer<Item> { item ->
                // Update the UI
            })
        }
    }

আপনি এটি বিপরীতেও করতে পারেন


0

100% কার্যনির্বাহী সমাধান: (যদি আপনাকে সহায়তা করে তবে আপটোটটি আঘাত করতে ভুলবেন না)

আপনার প্রথম খণ্ডে এই কোডের টুকরোটি রাখুন:

    editprofile.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    Fragment_editprofile Fragment = new Fragment_editprofile();
.
.
.
.
.


                Fragment.getintentdetails(tv_name.getText().toString(),
                            tv_mob.getText().toString(), tv_email.getText().toString(), tv_dob.getText().toString(),
                            tv_gender.getText().toString(), photointent);

                }
            });

দ্বিতীয় খণ্ডে, নীচের মতো পদ্ধতি তৈরি করুন:

public void getintentdetails(String name, String mobile, String email, String dob, String gender,
                                 String photointent) {

        this.name_str= name;
        this.mob_str= mobile;
        this.email_str= email;
        this.dob_str= dob;
        this.gender_str= gender;
        this.photo_str= photointent;

    }

তারপরে ক্লাস স্তরে একটি ভেরিয়েবল সংজ্ঞায়িত করুন:

String name_str, mob_str, dob_str, photo_str, email_str, gender_str;

তারপরে মান সেট করতে দ্বিতীয় খণ্ডে অন্য একটি পদ্ধতি তৈরি করুন:

  setexistingdetails();


private void setexistingdetails() {

        if(!name_str.equalsIgnoreCase(""))
            (et_name).setText(name_str);
        if(!mob_str.equalsIgnoreCase(""))
            et_mobile.setText(mob_str);
        if(!email_str.equalsIgnoreCase(""))
            email_et.setText(email_str);
        if(!dob_str.equalsIgnoreCase(""))
            dob_et.setText(dob_str);
        if(!gender_str.equalsIgnoreCase("")){
            if (gender_str.equalsIgnoreCase("m")){
                male_radio.setChecked(true);
            }else {
                female_radio.setChecked(true);
            }
        }
        if(!photo_str.equalsIgnoreCase("")){
            try {
                Picasso.get().load(Const.BASE_PATH+"include/sub-domain/GENIUS/"+photo_str).into(adminpropic_edit);
            } catch (Exception e) {            }
        }
    }

0

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

প্রথমত, ধরে নেওয়া ViewModelনামকরণ করা হয় SharedViewModel.java

public class SharedViewModel extends ViewModel {
    private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

    public void select(Item item) {
        selected.setValue(item);
    }
    public LiveData<Item> getSelected() {
        return selected;
    }
}

তারপরে উত্স খণ্ডটি হ'ল MasterFragment.javaসেখান থেকে আমরা কোনও ডেটা প্রেরণ করতে চাই।

public class MasterFragment extends Fragment {
    private SharedViewModel model;

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
        itemSelector.setOnClickListener(item -> {

            // Data is sent

            model.select(item);
        });
    }
}

এবং অবশেষে গন্তব্য খণ্ড হ'ল DetailFragment.javaআমরা যেখানে ডেটা পেতে চাই।

public class DetailFragment extends Fragment {

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
        model.getSelected().observe(getViewLifecycleOwner(), { item ->

           // Data is received 

        });
    }
}

0

ঠিক আছে এখানে খনন করার পরে আমি একটি সহজ সমাধান খুঁজে পেয়েছি, আসলে আপনার কখনই তথ্য টুকরো টুকরো টুকরো টুকরো করা উচিত নয় এটি সর্বদা একটি খারাপ ধারণা, আপনি খণ্ড A থেকে ক্রিয়াকলাপে ডেটা পাস করতে পারেন এবং খণ্ড বিতে ক্রিয়াকলাপ থেকে ডেটা পেতে পারেন can

For Example
//fragment A
//your method that will be called in Main Activity for getting data from this fragment
public List<customDataModel> getlist(){
return mlist; //your custom list 
}
buttonopen.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //before calling  your new fragment, send a Broadcast signal to your main activity
 mContext.sendBroadcast(new Intent("call.myfragment.action"));
//here you are now changing the fragment
Fragment fragment1 = new VolunteerListDetailsFragment();

            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.content_frame, fragment1);
            ft.commit();
        }
    });

// মূল ক্রিয়াকলাপে

this.registerReceiver(mBroadcastReceiver, new IntentFilter("call.myfragment.action"));//this line should be in your onCreate method
   BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
//init the fragment A
FragmenA fragment =
                (FragmentA) getSupportFragmentManager().findFragmentById(R.id.content_frame);
        mlistdetails = fragment.getlist();//this is my method in fragmentA which is retuning me a custom list, init this list type in top of on create fragment


    }
};
//here you are creating method that is returning the list that you just recieved From fragmentA
public List<customDataModel> getcustomlist(){
return mlistdetails; //you are returning the same list that you recived from fragmentA
}

// এখন ফ্র্যাগমেন্টবি তে

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

    View rootView = (View) inflater.inflate(R.layout.vol_listdetails, container, false);

    mlistdetails=((MainActivity)getActivity()).getcustomlist();//here you are calling the method that you have created in Main Activity

    Toast.makeText(getActivity().getApplicationContext(), mlistdetails.get(0).getItemqty(), Toast.LENGTH_SHORT).show();
    return rootView;

}

-2

আমি আমার মতো ভিক্ষুকদের জন্য সত্যিই সহজ কিছু তৈরি করেছি .. আমি আমার কার্যকলাপ_মন.এক্সএমএল এ একটি পাঠ্যদর্শন করেছি এবং রেখেছি

id=index
visibility=invisible

তারপরে আমি এই টেক্সটভিউটি প্রথম খণ্ড থেকে পেয়েছি

index= (Textview) getActivity().findviewbyid(R.id.index)
index.setText("fill me with the value")

এবং তারপরে দ্বিতীয় খণ্ডে আমি মান পাই

index= (Textview) getActivity().findviewbyid(R.id.index)
String get_the_value= index.getText().toString();

আশা করি এটা সাহায্য করবে!


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