webentwicklung-frage-antwort-db.com.de

Übergabe von Daten zwischen einem Fragment und seiner Containeraktivität

Wie kann ich Daten zwischen einem Fragment und seiner Containeraktivität übertragen? Gibt es etwas Ähnliches wie das Übertragen von Daten zwischen Aktivitäten durch Absichten?

Ich habe das gelesen, aber es hat nicht viel geholfen:
http://developer.Android.com/guide/topics/fundamentals/fragments.html#CommunicatingWithActivity

164
tyb

In Ihrem Fragment können Sie getActivity(). aufrufen

Dadurch erhalten Sie Zugriff auf die Aktivität, mit der das Fragment erstellt wurde. Von dort aus können Sie natürlich jede Art von Zugriffsmethoden aufrufen, die in der Aktivität enthalten sind.

z.B. für eine Methode mit dem Namen getResult() für Ihre Aktivität:

((MyActivity) getActivity()).getResult();
196
Nick

Versuchen Sie es mit Schnittstellen.

Jedes Fragment, das Daten an seine enthaltende Aktivität zurückgeben soll, muss eine Schnittstelle deklarieren, die die Daten verarbeitet und weitergibt. Stellen Sie dann sicher, dass Ihre übergeordnete Aktivität diese Schnittstellen implementiert. Zum Beispiel:

Deklarieren Sie in Ihrem Fragment die Schnittstelle ...

public interface OnDataPass {
    public void onDataPass(String data);
}

Verbinden Sie dann die Implementierung der enthaltenden Klasse der Schnittstelle mit dem Fragment in der Methode onAttach wie folgt:

OnDataPass dataPasser;

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    dataPasser = (OnDataPass) context;
}

Rufen Sie in Ihrem Fragment, wenn Sie die Datenübergabe durchführen müssen, einfach das dataPasser-Objekt auf:

public void passData(String data) {
    dataPasser.onDataPass(data);
}

Schließlich in Ihrer enthaltenden Aktivität die implementiertOnDataPass...

@Override
public void onDataPass(String data) {
    Log.d("LOG","hello " + data);
}
284
Harlo Holmes

Einfachster Ansatz, aber nicht empfohlen

Sie können über Fragment auf Aktivitätsdaten zugreifen:

Aktivität:

public class MyActivity extends Activity {

    private String myString = "hello";

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

    public String getMyData() {
        return myString;
    }
}

Fragment:

public class MyFragment extends Fragment {

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

        MyActivity activity = (MyActivity) getActivity();
        String myDataFromActivity = activity.getMyData();
        return view;
    }
}
22
Xar E Ahmer
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    Bundle b = getActivity().getIntent().getExtras();
            wid = b.getString("wid");
            rid = b.getString("rid");
            View view = inflater.inflate(R.layout.categoryfragment, container, false);
    return view;
 }
21
Jeetu

Übergabe von Daten zwischen einem Fragment und seiner Containeraktivität

Aktivität:

        Bundle bundle = new Bundle();
        bundle.putString("message", "Alo Elena!");
        FragmentClass fragInfo = new FragmentClass();
        fragInfo.setArguments(bundle);
        transaction.replace(R.id.fragment_single, fragInfo);
        transaction.commit();

Fragment:

Lesen Sie den Wert im Fragment

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        String myValue = this.getArguments().getString("message");
        ...
        ...
        ...
        }
14
Jorgesys

Ich weiß nicht, ob dies der beste Weg ist oder nicht. Ich habe eine ganze Weile auf Google gesucht, um herauszufinden, wie ich ein Bundle von einem Fragment an seine Containeraktivität übergeben kann, aber alles, was ich fand, war, Daten von Aktivität an Fragment zu senden (was für mich etwas verwirrend war, da ich ein Neuling bin).

später habe ich etwas Eigenes ausprobiert, das genau so funktioniert hat, wie ich es wollte. also werde ich es hier posten, falls jemand wie ich dasselbe sucht.

// Daten von Fragment übergeben.

Bundle gameData = new Bundle();
        gameData.putStringArrayList(Constant.KEY_PLAYERS_ARR,players);
        gameData.putString(Constant.KEY_TEAM_NAME,custom_team_name);
        gameData.putInt(Constant.KEY_REQUESTED_OVER,requestedOver);

        Intent intent = getActivity().getIntent();
        intent.putExtras(gameData);

// Daten aus dem Bundle aus der Containeraktivität abrufen.

Bundle gameData = getIntent().getExtras();
        if (gameData != null)
        {
            int over = gameData.getInt(Constant.KEY_REQUESTED_OVER);
            ArrayList<String> players = gameData.getStringArrayList(Constant.KEY_PLAYERS_ARR);
            String team = gameData.getString(Constant.KEY_TEAM_NAME);

        }
        else if (gameData == null)
        {
            Toast.makeText(this, "Bundle is null", Toast.LENGTH_SHORT).show();
        }
6
Frozen Diary

Schnittstelle ist eine der besten Lösungen:

Kleber Schnittstelle:

public interface DataProviderFromActivity {

    public String getName();
    public String getId);

}  

Meine Aktivität:

public class MyActivity implements DataProviderFromActivity{

    String name = "Makarov";
    String id = "sys533";

    ... ... ... ... ... .... .... 
    ... ... ... ... ... .... .... 

    public String getName(){
        return name;
    };
    public String getId(){
        return id;
    };
}

MyFragment:

public class MyFragment extends Fragment{

    String fragName = "";
    String fragId = "";

    ... ... ... ... ... .... .... 
    ... ... ... ... ... .... .... 

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

        DataProviderFromActivity myActivity= (DataProviderFromActivity) getActivity();
        fragName = myActivity.getName();
        fragId = myActivity.getId();

        ... ... ... ... ... .... .... 
        ... ... ... ... ... .... .... 

        updateFragmentView();
    }
}
4
Hassan Tareq

Ich habe eine AppCompatActivity verwendet, die Date Listener implementiert. Fragmente waren notwendig, da ich einen Datumsbereichsselektor codieren musste. Außerdem musste der Container die ausgewählten Daten erhalten, um sie an die übergeordnete Aktivität zurückzugeben.

Für die Containeraktivität ist dies die Klassendeklaration:

public class AppCompatDateRange extends AppCompatActivity implements
    DateIniRangeFragment.OnDateIniSelectedListener, DateFimRangeFragment.OnDateFimSelectedListener

Und die Schnittstellen für die Rückrufe:

@Override
public void onDateIniSelected(String dataIni) {
    Log.i("data inicial:", dataIni);
}

@Override
public void onDateFimSelected(String dataFim) {
    Log.i("data final:", dataFim);
}

Die Rückrufe sind Zeichenfolgen, da Datumsangaben in einer Abfrageauswahl Parameter sind.

Der Code für die Fragmente (basierend auf dem ursprünglichen Datumsfragment):

public class DateIniRangeFragment extends Fragment {
OnDateIniSelectedListener callbackIni;

private DatePicker startDatePicker;

public DateIniRangeFragment() {
    ///required empty constructor
}

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

///through this interface the fragment sends data to the container activity
public interface OnDateIniSelectedListener {
    void onDateIniSelected(String dataIni);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ///layout for the fragment
    View v = inflater.inflate(R.layout.date_ini_fragment, container, false);

    ///initial date for the picker, in this case, current date
    startDatePicker = (DatePicker) v.findViewById(R.id.start_date_picker_appcompat);
    Calendar c = Calendar.getInstance();
    int ano = c.get(Calendar.YEAR);
    int mes = c.get(Calendar.MONTH);
    int dia = c.get(Calendar.DAY_OF_MONTH);
    startDatePicker.setSpinnersShown(false);
    startDatePicker.init(ano, mes, dia, dateSetListener);

    return v;
}

///listener that receives the selected date
private DatePicker.OnDateChangedListener dateSetListener = new DatePicker.OnDateChangedListener() {
    public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        if (view.isShown()) { ///if the datepicker is on the screen
            String sDataIni = year + "-" + (monthOfYear + 1) + "-" + dayOfMonth;
            callbackIni.onDateIniSelected(sDataIni); //apply date to callback, string format
        }
    }
};

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

    /*
    * this function guarantees that the container activity implemented the callback interface
    * */
    try {
        callbackIni = (OnDateIniSelectedListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString() + " deve implementar OnDateIniSelectedListener");
    }
}

}

Um den Container und die Fragmente zusammenzustellen, habe ich einen ViewPager (AppCompat) mit einer benutzerdefinierten Klasse verwendet, die FragmentPagerAdapter erweitert. Keine Dialoge.

2
Pablo

Sie können einfach EventBus verwenden, es ist einfach und funktioniert großartig

EventBus in 3 Schritten

  1. Ereignisse definieren:

    public static class MessageEvent { /* Additional fields if needed */ }

  2. Abonnenten vorbereiten: Deklarieren und kommentieren Sie Ihre Abonnementmethode, und geben Sie optional einen Thread-Modus an:

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event) {/* Do something */};

Registrieren Sie Ihren Abonnenten und heben Sie die Registrierung auf. Beispielsweise sollten Aktivitäten und Fragmente unter Android normalerweise gemäß ihrem Lebenszyklus registriert werden:

 @Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 }

 @Override
 public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
 }
  1. Ereignisse posten:

    EventBus.getDefault().post(new MessageEvent());

2
Sattar

Ich weiß, das könnte zu spät sein. Aber ich war auch immer in dieser Frage verloren. Ich teile diesen Link ... weil dies möglicherweise die beste Erklärung ist, die ich jemals im Web dafür gefunden habe. Dies löst Fragment zu Aktivität & Fragment zu Fragment !

Gelöst & sehr gut erklärt

1
Yo Apps
public class Fragmentdemo extends Fragment {

  public interface onDemoEventListener {
    public void demoEvent(String s);
  }

  onDemoEventListener demoEventListener;

  @Override
  public void onAttach(Activity activity) {
    super.onAttach(activity);
        try {
          demoEventListener = (onDemoEventListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement onDemoEventListener");
        }
  }

  final String LOG_TAG = "TAG";

  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragmentdemo, null);

    Button button = (Button) v.findViewById(R.id.button);
    button.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        demoEventListener.someEvent("Test text to Fragment1");
      }
    });
    enter code here
    return v;
  }
}
0

Das funktioniert für mich ..

fügen Sie in Aktivität diese Methode hinzu

    public void GetData(String data)
     {
        // do something with your data        
     }

und in Fragment füge diese Zeile hinzu

((YourActivity)getContext).GetData("your data here");
0
Basant