it-swarm.com.de

Android - Wie kann ich Daten von Aktivität an Fragment übergeben?

Ich muss Daten von Aktivität zu Fragment weitergeben. Ich weiß, dass ich Bundle verwenden kann, aber sobald ich Daten übergeben habe, kann ich keine Daten senden, ohne erneut Fragmente aufzurufen und zu erstellen. 

In meiner Aktivität kann sich etwas ändern, und ich muss mein Fragment über diese Änderungen informieren, ohne das Fragment neu erstellen zu müssen. 

9
navid abutorab

Erstellen Sie ein interface in Ihrem Activity und übergeben Sie Ihre Daten über das interface an das fragment. Implementieren Sie dieses interface in Ihrem fragment, um Daten zu erhalten. 

Zum Beispiel

MainActivity.class

public class MainActivity extends AppCompatActivity {

    DataFromActivityToFragment dataFromActivityToFragment;

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

        FragmentA fr = new FragmentA();
        FragmentManager fm = getFragmentManager();
        dataFromActivityToFragment = (DataFromActivityToFragment) fr;
        FragmentTransaction fragmentTransaction = fm.beginTransaction();
        fragmentTransaction.replace(R.id.fragment_place, fr);
        fragmentTransaction.commit();


        final Handler handler = new Handler();

        final Runnable r = new Runnable() {
            public void run() {
                dataFromActivityToFragment.sendData("Hi");
            }
        };

        handler.postDelayed(r, 5000);


    }

    public interface DataFromActivityToFragment {
        void sendData(String data);
    }
}

FragmentA.class

public class FragmentA extends Fragment implements MainActivity.DataFromActivityToFragment {

    TextView text;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.content_main, null);
        text = (TextView) rootView.findViewById(R.id.fragment_text);

        return rootView;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }

    @Override
    public void sendData(String data) {
        if(data != null)
        text.setText(data);
    }
}

activity_main.xml

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical" >

    <LinearLayout
        Android:id="@+id/fragment_place"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:orientation="horizontal">
    </LinearLayout>

</LinearLayout>

content_main.xml

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <TextView
        Android:id="@+id/fragment_text"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" />

</LinearLayout>

In obigem Beispiel habe ich Runnable genommen, um Daten mit einer Verzögerung von 5 Sekunden nach Erstellung von fragment zu senden.

14
pooja

Fragment-Objekt ist wie andere Objekte. Wie String können Sie Methoden des String-Objekts, str.charAt (0), str.toUpperCase () usw. aufrufen. Erstellen Sie einfach eine Funktion in fragment, geben Sie Ihren Code dort ein und rufen Sie die Funktion mit auf Werte

Inside Activity {
  fragDemoObject.doWhatYouWant("this is passed as string object to fragment");
}

Inside FragmentDemo{
  void doWhatYouWant(String input){
     System.out.println(input);
    // do what else you want to do with code
  }

}
3
Pavneet_Singh

Das Benachrichtigungsfragment mit einigen Daten, nachdem es erstellt wurde, kann mit einem bestimmten Communicator ausgeführt werden, oder Sie können die Daten immer zusammen mit dem Bündel in der Erstellungszeit übergeben ...

public interface FragmentCommunicator {

void updateDataToFragment(List<Parcelable> data);

} Implementieren Sie dann in Ihrem Fragment diese Schnittstelle und rufen Sie sie aus der Aktivität auf, zum Beispiel: `

Fragment fragment = mSectionsPagerAdapter.getRegisteredFragment(i);
            if (fragment instanceof FragmentCommunicator) {
                FragmentCommunicator fragmentCommunicator = (FragmentCommunicator) fragment;
                fragmentCommunicator.updateDataToFragment(data);

        }`

Dies sollte für Ihren Fall funktionieren ...

1
Balflear

Die Host-Aktivität kann Nachrichten an ein Fragment liefern, indem sie .__ aufzeichnet. Fragmentinstanz mit findFragmentById () fragmentieren, dann direkt die .__ aufrufen. Fragment öffentlichen Methoden.

Erstellen Sie in Ihrem Fragment - MyFragment eine öffentliche Methode

public void myFragmentDataFromActivity(int passedDataFromActivity) {

// do your stuff

}

Um in Ihrer Aktivität einen ganzzahligen Wert zu übergeben, sagen Sie 100:

rufen Sie die MyFragment-Instanz mit getSupportFragmentManager oder getFragmentManager ab, indem Sie id/tag/position angeben. Rufen Sie dann die öffentliche Methode in der MyFragment-Instanz auf.

MyFragment myFragment = (MyFragment) getSupportFragmentManager.getFragmentById(id);

myFragment.myFragmentDataFromActivity(100);

Sie können auch getFragmentByTag(tag), getFragments().get(position) anstelle von getFragmentById(id) verwenden, um die Fragmentinstanz abzurufen.

Lesen Sie mehr darüber

1
tpk

Ihre Frage bezieht sich eigentlich nicht auf: 

Ich muss Daten von Aktivität an fragmenet übergeben. Ich weiß, dass ich .__ verwenden kann. Bündel, aber ich habe Daten weitergegeben, ich kann keine Daten mehr ohne .__ senden. erneut aufrufen und Fragment erstellen.

Das Wirkliche ist:

in meiner Tätigkeit kann sich etwas ändern, und ich muss mein .__ benachrichtigen. Fragment von diesen Änderungen, ohne Fragment neu zu erstellen.

wie kann ich das machen?

In diesem Fall würde ich das Fragment in der Aktivität als Referenz speichern und eine Funktion, eine Schnittstellenimplementierung innerhalb des Fragments, nennen.

Etwas wie das:

In Aktivität:

SomeEventListener myFragment  ;

yourFragmentCreationMethod(){
 if(myFragment == null){
    myFragment  = new MyFragment(maybeParamsHere);
  }
}

yourNotificationMethod(){
   myFragment .onEventHappent(param);
}

// declare an interface: - separate file
public interface SomeEventListener
{
    void onEventHappent(param);
}

// implement the interface in Fragment - separate file
public class MyFragment extends Fragment implements SomeEventListener{
    // add a constructor what you like

    public void onEventHappent(param){
           /// ... your update
    }
}

Die Schnittstelle hilft Ihnen nur beim Testen.

1
matheszabi

versuchen Sie es in Aktivität

fragment=new PdfFragment();
if (fragment != null) {
    FragmentManager fragmentManager = getFragmentManager();

        Bundle bundle = new Bundle();
        bundle.putString("pdf", Pdf);
    bundle.putString("flag", "0");
    fragment.setArguments(bundle);

    fragmentManager.beginTransaction().replace(R.id.container, fragment).addToBackStack(null).commit();
}

und in fragment

     Pdf = getArguments().getString("pdf");
0
Mr. Mad

Sie sollten Ihre Methode im Fragment als öffentlich deklarieren, um neue Daten zu aktualisieren. Dann rufen Sie diese Methode über die Fragmentinstanz auf. Schreiben Sie dies beispielsweise in Ihre Aktivität, wenn Sie neue Daten erhalten:

fragmentInstance.publicMethod(newData);

Viel Spaß beim Codieren!

0
Na Pro

Ich bin auch auf das gleiche Problem gestoßen, ich habe Singleton-Klasse für .__ verwendet. Daten von Aktivität zu Fragment übertragen (ohne Fragment Transaktion oder Inteface zu verwenden)

class DataPersistance {


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPlace() {
        return place;
    }

    public void setPlace(String place) {
        this.place = place;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    private String name;
    private String place;
    private String type;

    private static final DataPersistance ourInstance = new DataPersistance();

    static DataPersistance getInstance() {
        return ourInstance;
    }

    private DataPersistance() {
    }
}

daten einstellen und abrufen

        DataPersistance.getInstance().setName(mEditText.getText().toString());
      String name =  DataPersistance.getInstance().getName();
0
akshay_shahane