Wert aus Fragment ermitteln

  • Antworten:7
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 390

08.02.2021, 20:46:32 via Website

Hallo zusammen

Ich habe eine Activity. Darauf habe ich Fragmente welche ich als Tabulatoren zusammen gefasst habe.

image

Wie kann ich aus meiner Activity ermitteln, was in welchem Fragment eingestellt ist?

Mit getArguments kann ich dem Fragment Parameter übergeben. Wie funktioniert das auf dem umgekehrten Weg?

Zuletzt noch der Code:
ein Fragment

package ch.robbisoft.kck_app;

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RadioGroup;

/**
* A simple {@link Fragment} subclass.
* Use the {@link FragBass#newInstance} factory method to
* create an instance of this fragment.
*/
public class FragBass extends Fragment {

private RadioGroup obj_grpbass;

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;

public FragBass() {
    // Required empty public constructor
}

/**
 * Use this factory method to create a new instance of
 * this fragment using the provided parameters.
 *
 * @param param1 Parameter 1.
 * @param param2 Parameter 2.
 * @return A new instance of fragment FragBass.
 */
// TODO: Rename and change types and number of parameters
public static FragBass newInstance(String param1, String param2) {
    FragBass fragment = new FragBass();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}

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

    obj_grpbass = (RadioGroup) rootview.findViewById(R.id.grp_bass);
    obj_grpbass.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup radioGroup, int check) {
            switch( check ){
                case R.id.rbtn_einsbass : break;
                case R.id.rbtn_zweibass : break;
                case R.id.rbtn_dreibass : break;
                case R.id.rbtn_vierbass : break;
                case R.id.rbtn_fuenfbass : break;
            }
        }
    });

    return rootview;
}

}

die aufrufende Activity

package ch.robbisoft.kck_app;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import android.content.Context;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.TabHost;
import android.widget.TextView;

import com.google.android.material.tabs.TabLayout;

public class Popularis extends AppCompatActivity {

private Context ctx = null;
private int tabpos;
private Fragment fragment = null;
private FragmentManager fragmanager = null;
private FragmentTransaction fragtransaction = null;

private MediaPlayer mp = null;
public int n_lied = 0;
private static int n_lang;

private ImageButton obj_start;
private ImageButton obj_pause;
private ImageButton obj_stop;
private ProgressBar obj_dauer;
private ImageButton obj_zuruck;
private ImageButton obj_vor;
private TextView txt_links;
private TextView txt_rechts;

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

    ctx = getApplicationContext();

    TabLayout obj_lied = (TabLayout) findViewById(R.id.tab_lied);
    TabLayout.Tab sopran1 = obj_lied.newTab(); // Create a new Tab names
    sopran1.setText(getString(R.string.lbl_sopran1)); // set the Text for the first Tab

// sopran1.setIcon(R.drawable.ic_launcher); // set an icon for the first tab
obj_lied.addTab(sopran1, true);

    TabLayout.Tab sopran2 = obj_lied.newTab();
    sopran2.setText(getString(R.string.lbl_sopran2));
    obj_lied.addTab(sopran2);

    TabLayout.Tab alt = obj_lied.newTab();
    alt.setText(getString(R.string.lbl_alt));
    obj_lied.addTab(alt);

    TabLayout.Tab tenor = obj_lied.newTab();
    tenor.setText(getString(R.string.lbl_tenor));
    obj_lied.addTab(tenor);

    TabLayout.Tab bass = obj_lied.newTab();
    bass.setText(getString(R.string.lbl_bass));
    obj_lied.addTab(bass);

    tabpos = obj_lied.getSelectedTabPosition();
    obj_lied.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            tabpos = tab.getPosition();
            switch ( tabpos ){
                case 0 : fragment = new FragSopranEins();
                            break;
                case 1 : fragment = new FragSopranZwei();
                            break;
                case 2 : fragment = new FragAlt();
                            break;
                case 3 : fragment = new FragTenor();
                            break;
                case 4 : fragment = new FragBass();
            }
            fragmanager = getSupportFragmentManager();
            fragtransaction = fragmanager.beginTransaction();
            fragtransaction.replace(R.id.simpleFrameLayout, fragment);
            fragtransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
            fragtransaction.commit();
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
    fragment = new FragSopranEins();
    fragmanager = getSupportFragmentManager();
    fragtransaction = fragmanager.beginTransaction();
    fragtransaction.replace(R.id.simpleFrameLayout, fragment);
    fragtransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    fragtransaction.commit();

    obj_start = (ImageButton) findViewById(R.id.btn_start);
    obj_start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mp = (MediaPlayer) MediaPlayer.create(ctx, n_lied);
            mp.start();
        }
    });
    obj_pause = (ImageButton) findViewById(R.id.btn_pause);
    obj_stop = (ImageButton) findViewById(R.id.btn_stop);
    obj_zuruck = (ImageButton) findViewById(R.id.btn_zuruck);
    obj_vor = (ImageButton) findViewById(R.id.btn_vor);
    obj_dauer = (ProgressBar) findViewById(R.id.prb_lied);
    txt_links = (TextView) findViewById(R.id.tv_start);
    txt_rechts = (TextView) findViewById(R.id.tv_end);

    txt_links.setText("0:00");
    txt_rechts.setText("0:00");
}

}

Gruss Renato

Diskutiere mit!
  • Forum-Beiträge: 1.421

08.02.2021, 21:21:56 via Website

Da gibt es mehrere Möglichkeiten.

Im Fragment ein Interfaces erstellen was du on der Activity importierst.

Eine public static Variable in der Aktivity auf die du im Fragment zugreifen kannst.

Eine Singelton Klasse in der du die Werte speicherst die Instanz kannst du dir in allen Klassen holen.
Auch das neue ViewModel ist eine Möglichkeit. Alternative zu Singelton.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.329

09.02.2021, 11:55:32 via Website

Ich würde mir an zentraler Stelle eine Möglichkeit schaffen wo das gespeichert wird.
Von der Activity auf die Fragmente zuzugreifen und dann darin Methoden aufrufen finde ich immer unsauber und fragil.

Konkret eine zentrale Klasse, die ein LiveData hat, wo die Fragmente bei Änderung den Wert hin schreiben.
Das kannst du dann von überall auslesen und/oder abonnieren.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 1.421

09.02.2021, 12:08:22 via Website

@Rafael
Ja an einer zentralen Stelle ist genau das Prinzip einer Singelton Klasse was ich auch mit vorgeschlagen habe.

Von der Activity auf die Fragmente zuzugreifen und dann darin Methoden aufrufen finde ich immer unsauber und fragil.

Wird auch nicht immer gehn vorallen wenn das Fragment nicht geladen wurde.
Aber er will vom Fragment aus Daten an die Activity übergeben. Und das kann man auch mit Interfaces machen.
Schöner und einfacher ist Zentral Singelton.

— geändert am 09.02.2021, 12:18:33

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 390

09.02.2021, 14:47:14 via Website

Hallo zusammen

Danke für eure wertvolle Hilfe. Da habe ich ja was zu tun.

Provisorisch habe ich es mit einer Static Variable gemacht. Funktioniert. Aber ich denke mit einer Singelton Klasse wäre bestimmt besser. Ich habe ein Buch wo so was drinsteht. Verstanden habe ich es aber nicht ganz. Aber ich werde mich nochmals reinhängen und einen Versuch starten. Programmieren bis mir das Handy um die Ohren fliegt. Ich ziehe einfach eine Maske an, dann kann mir nichts passieren. (laughing)

Gruss Renato

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 390

09.02.2021, 17:31:21 via Website

Ciao Jokel

Das ist nett von dir. Ich schaue mal ob ich es auf die Reihe kriege. Falls nicht, melde ich mich bei dir.

Gruss Renato

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 390

10.02.2021, 19:49:08 via Website

Ist gar nicht so kompliziert. In meinem Buch wurde das ganze extrem umständlich erklärt. Aber ich habe eine Webseite gefunden wo alles relativ einfach aufzeigt.

Singelton Beispiel

Wenn man es verstanden hat, ist es etwas ganz geniales.

Gruss Renato

— geändert am 10.02.2021, 23:04:15 durch Moderator

Hilfreich?
Diskutiere mit!