362 Stimmen

Daten von einer Aktivität an ein Fragment in Android senden

Ich habe zwei Klassen. Die erste ist Aktivität, die zweite ist ein Fragment, in dem ich einige EditText . In activity habe ich eine Unterklasse mit async-task und in method doInBackground Ich erhalte ein Ergebnis, das ich in einer Variablen speichere. Wie kann ich diese Variable von der Unterklasse "Meine Aktivität" an dieses Fragment senden?

16voto

diyoda_ Punkte 5108

Die Grundidee der Verwendung von Fragmenten (F) ist die Erstellung wiederverwendbarer, selbsttragender UI-Komponenten in Android-Anwendungen. Diese Fragmente sind in Aktivitäten enthalten und es gibt gemeinsame (beste) Wege, um Kommunikationspfade von A -> F und F-A zu erstellen. Es ist ein Muss, zwischen F-F durch eine Aktivität zu kommunizieren, weil nur dann die Fragmente entkoppelt und selbsttragend werden.

Die Übergabe von Daten von A -> F erfolgt also auf die gleiche Weise wie von K erklärt. Zusätzlich zu dieser Antwort können wir nach der Erstellung der Fragmente innerhalb einer Aktivität auch Daten an die Fragmente übergeben, indem wir Methoden in Fragmenten aufrufen.

Zum Beispiel:

    ArticleFragment articleFrag = (ArticleFragment)
                    getSupportFragmentManager().findFragmentById(R.id.article_fragment);
    articleFrag.updateArticleView(position);

13voto

Adrian Stoica Punkte 436

Ich möchte für die Anfänger hinzufügen, dass der Unterschied zwischen den 2 am meisten hochgestimmten Antworten hier gegeben ist

I

Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);

I

I aquí )

W

T

S

O P ).

T

 public static class Tab1 extends Fragment {

    public Tab1() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
        return rootView;
    }
}.

S

public class MotherActivity extends Activity {

    private String out;
    private Bundle results;

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

       // for example get a value from the previous activity
        Intent intent = getIntent();
        out = intent.getExtras().getString("Key");

    }

    public Bundle getMyData() {
        Bundle hm = new Bundle();
        hm.putString("val1",out);
        return hm;
    }
}

A

public static class Tab1 extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        public Tab1() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
            TextView output = (TextView)rootView.findViewById(R.id.your_id_for_a_text_view_within_the_layout);

            MotherActivity activity = (MotherActivity)getActivity();

            Bundle results = activity.getMyData();
            String value1 = results.getString("val1");

            output.setText(value1);
            return rootView;
        }
    }

I

M

S t ,

Y

I

P

8voto

Vijay Punkte 608

De Activity senden Sie Daten mit Bundle as:

Bundle bundle = new Bundle();
bundle.putString("data", "Data you want to send");

// Your fragment
MyFragment obj = new MyFragment();
obj.setArguments(bundle);

Und in Fragment onCreateView-Methode werden die Daten abgerufen:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
    String data = getArguments().getString("data");// data which sent from activity  
    return inflater.inflate(R.layout.myfragment, container, false);
}

8voto

Martin Punkte 3686

Wenn Sie einen Verweis auf das Fragment (konkrete Unterklasse des Fragments) an die asynchrone Aufgabe übergeben, können Sie direkt auf das Fragment zugreifen.

Einige Möglichkeiten zur Übergabe der Fragmentreferenz an die asynchrone Aufgabe:

  • Wenn Ihre asynchrone Aufgabe eine vollwertige Klasse ist ( class FooTask extends AsyncTask ), dann übergeben Sie Ihr Fragment an den Konstruktor.
  • Wenn Ihre asynchrone Aufgabe eine innere Klasse ist, deklarieren Sie einfach eine finale Fragment-Variable in dem Bereich, in dem die asynchrone Aufgabe definiert ist, oder als ein Feld der äußeren Klasse. Sie können dann von der inneren Klasse aus darauf zugreifen.

7voto

fralbo Punkte 2434

Manchmal können Sie Intent in Ihrer Aktivität empfangen und müssen die Informationen an Ihr Arbeitsfragment weitergeben.
Die gegebenen Antworten sind OK, wenn Sie das Fragment starten müssen, aber wenn es noch funktioniert, setArguments() ist nicht sehr nützlich.
Ein weiteres Problem tritt auf, wenn die übergebenen Informationen zu einer Interaktion mit der Benutzeroberfläche führen. In diesem Fall können Sie nicht so etwas aufrufen wie myfragment.passData() weil Android schnell erkennt, dass nur der Thread, der die Ansicht erstellt hat, mit ihr interagieren kann.

Mein Vorschlag ist daher, einen Empfänger zu verwenden. Auf diese Weise können Sie Daten von überall her senden, auch von der Aktivität, aber die Aufgabe wird im Kontext des Fragments erledigt.

In Ihrem Fragment ist onCreate() :

protected DataReceiver dataReceiver;
public static final String REC_DATA = "REC_DATA";

@Override
public void onCreate(Bundle savedInstanceState) {

    data Receiver = new DataReceiver();
    intentFilter = new IntentFilter(REC_DATA);

    getActivity().registerReceiver(dataReceiver, intentFilter);
}

private class DataReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        int data= intent.getIntExtra("data", -1);

        // Do anything including interact with your UI
    }
}

In Ihrer Tätigkeit:

// somewhere
Intent retIntent = new Intent(RE_DATA);
retIntent.putExtra("data", myData);
sendBroadcast(retIntent);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X