2014-04-23 10 views
8

Ich bin ein Neuling für Fragmente. Ich möchte einen String-Wert von einem Fragment zu einem anderen übergeben. Wie macht man das? Ich habe meine Fragmente auf folgende Weise aufgerufen. Bitte führen Sie mich Schritt für Schritt.Wie übermittele ich in Android einen Wert von einem Fragment zum anderen?

String cid = id.getText().toString(); 
Fragment fr = new FriendFragment(); 
android.app.FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.replace(R.id.content_frame, fr); 
ft.commit(); 

Antwort

27

Sie können wie unten etwas tun,

String cid=id.getText().toString(); 
Fragment fr=new friendfragment(); 
FragmentManager fm=getFragmentManager(); 
android.app.FragmentTransaction ft=fm.beginTransaction(); 
Bundle args = new Bundle(); 
args.putString("CID", cid); 
fr.setArguments(args); 
ft.replace(R.id.content_frame, fr); 
ft.commit(); 

die Daten zu erhalten gehen Sie wie folgt,

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

Wie es am anderen Fragment zu erhalten? – user3256145

+0

@ user3256145: siehe meinen bearbeiteten Antwortpartner. –

+0

Dies führt zu Undichtigkeiten, wenn die Daten riesig sind. Stattdessen sollten Sie das Schnittstellendesign für die Kommunikation zwischen Fragmenten verwenden. –

0

Fragment Fragment Kommunikation durch die übergeordnete Aktivität getan werden muss.

FragmentToSendData

interface <interfaceName>{ 
    void <abstract method>(String str); 
} 

@Override 
public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try{ 
      <instance of the interface> = (<interface>)getActivity(); 
     }catch (ClassCastException e) { 
      throw new ClassCastException(getActivity().toString() 
        + " must implement <interface>"); 
     } 

    } 

ActivityWithBothFragments (dies durch ViewPager sein kann, oder die ID Ihres Fragment verwenden, benutzen Sie einfach findFragmentById())

@Override <abstract method from frag1>(String str){ 
    FragmentToReceiveData fragment2 = (FragmentToReceiveData)getSupportFragmentManager().findFragmentByTag(ViewPagerAdapter.getFragmentTag(1));                                     

    fragment2.getStringFromFrag1(String str); 
} 

FragmentToReceiveData

public void getStringFromFrag1(String str){ 
    <textview>.setText("str"); 

} 
+0

Muss die bei onDetach() nicht gelöscht werden? – Jonas

5

Wenn Sie Daten von Fragment zu Aktivität senden möchten, können Sie eine Schnittstelle verwenden.

Aber wenn Sie Daten von Fragment zu einem anderen Fragment senden wollen, wird es kompliziert. Sie möchten Daten an Aktivität und dann an das andere Fragment senden.

Ich verwende EventBus, um dieses Problem zu lösen. Wie es funktioniert.

  1. Erstellen Sie ein Ereignis-E.
  2. Von Fragment-A registrieren für Ereignisse.
  3. Von Fragment-B veröffentlichen Ereignis-E mit Daten, die Sie übergeben möchten.
  4. Sie würden die Daten in onEvent() -Methode erhalten, die Sie in Fragment-A geschrieben haben.

Das ist es. Keine Notwendigkeit, eigene Schnittstellen zu schreiben.

Sie können Eventbus für die Kommunikation von Hintergrunddienst oder Threads zu Aktivität auch verwenden.

Bezahlen Sie die EventBus HowTo und Repository auch.

+0

Kann ich Sie bitten, den folgenden Beitrag bitte zu lesen? [Wie biete ich persönliche Open-Source-Bibliotheken an?] (Https://meta.stackexchange.com/q/229085) –

0
try this : 

- send data : 

     Bundle arg = new Bundle(); 
     arg.putInt("ID", "12"); //arg.putInt("KEY", "VALUE") 
     arg.putString("NAME","Jaydeep");//arg.putString("KEY","VALUE") 

     YourFragment fragment = new YourFragment(); 
     fragment.setArguments(arg); 

     fragmentManager.beginTransaction().add("PUT YOUR FRAM ID", fragment, fragment.getClass().getName()) 
     .addToBackStack(null) 
     .commit(); 

- receive data : 

     Bundle bundle = getIntent().getExtras(); 
     bundle.getInt("ID"); 
     bundle.getString("NAME"); 

     Log.e("Receive data : " ,"\nID - "+bundle.getInt("ID")+"\nNAME - "+bundle.getString("NAME")); 
Verwandte Themen