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?
Antworten
Zu viele Anzeigen?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);
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
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);
}
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.
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);