1

i am searching for weeks but i couldn't fix my problem. I want to pass data from a fragment to another fragment.

i tried with bundle and interface but none of them worked. could you help me with this i will be appreciate that I want to pass data from this fragment its name is "FragmentGelir"

public class FragmentGelir extends Fragment {
private Toolbar toolbarGelir;
private FloatingActionButton fabGelir;
private RecyclerView rvgelir;
private ArrayList<Gelirler> gelirlerArrayList;
private GelirlerAdapter adapter;
private Veritabani vt;
public double toplamgelir = 0.0;
public String anahtar;


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_gelir, container, false);

    anahtar = "test";

    FragmentHomepage fragmentHomepage = new FragmentHomepage();
    Bundle bundle = new Bundle();
    bundle.putString("anahtar", anahtar);
    fragmentHomepage.setArguments(bundle);


    fabGelir = rootView.findViewById(R.id.fabGelir);
    toolbarGelir = rootView.findViewById(R.id.toolbarGelir);
    rvgelir = rootView.findViewById(R.id.rvgelir);
    toolbarGelir.setTitle("Gelir Ekle");


    vt = new Veritabani(getActivity());
    rvgelir.setHasFixedSize(true);
    rvgelir.setLayoutManager(new LinearLayoutManager(getActivity()));
    gelirlerArrayList = new GelirlerDatabaseAccessObject().tumGelirler(vt);
    adapter = new GelirlerAdapter(getActivity(), gelirlerArrayList, vt);
    rvgelir.setAdapter(adapter);
    fabGelir.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            alertgoster();

        }
    });

    for (Gelirler gel : gelirlerArrayList) {
        toplamgelir = toplamgelir + gel.getGelirTutar();
    }
    toolbarGelir.setSubtitle("toplam Gelir: " + toplamgelir);
    return rootView;
}

public void alertgoster() {
    LayoutInflater layout = LayoutInflater.from(getActivity());
    View tasarim = layout.inflate(R.layout.alert_gelir, null);

    final EditText editTextGelir = tasarim.findViewById(R.id.editTextGider);
    final EditText editTextGelirTutar = tasarim.findViewById(R.id.editTextGiderTutar);

    final AlertDialog.Builder gelir = new AlertDialog.Builder(getActivity());
    gelir.setTitle("Gelir Ekle");
    gelir.setView(tasarim);

    gelir.setPositiveButton("Ekle", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

            String gelir_ekle = editTextGelir.getText().toString().trim();
            Double gelir_tutar = Double.parseDouble(editTextGelirTutar.getText().toString().trim());

            new GelirlerDatabaseAccessObject().GelirEkle(vt, gelir_ekle, gelir_tutar);
            gelirlerArrayList = new GelirlerDatabaseAccessObject().tumGelirler(vt);
            adapter = new GelirlerAdapter(getActivity(), gelirlerArrayList, vt);
            rvgelir.setAdapter(adapter);
            Toast.makeText(getContext().getApplicationContext(), gelir_ekle + " - " + gelir_tutar + " olarak Eklendi", Toast.LENGTH_SHORT).show();
        }
    });

    gelir.setNegativeButton("İptal", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
        }
    });
    gelir.create().show();
}

}

this is the my second fragment which should get the data "Fragmenthomepage"

public class FragmentHomepage extends Fragment {
private Toolbar toolbarHome;
private TextView textViewbugunGelir;
private TextView textViewbugunGider;
public String strtext;

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

    View rootView = inflater.inflate(R.layout.fragment_homepage, container, false);
    toolbarHome = rootView.findViewById(R.id.toolbarHome);
    toolbarHome.setTitle("Gelir gider hesaplar");
    textViewbugunGider = rootView.findViewById(R.id.textViewbugunGider);

    strtext = getArguments().getString("anahtar"); //this is not working getting error "null object reference"
    textViewbugunGelir = rootView.findViewById(R.id.textViewbugunGelir);
    textViewbugunGelir.setText(strtext);

    return rootView;
}

}

here it is my MainActivity

public class MainActivity extends AppCompatActivity  {
private BottomNavigationView bottom_navigation;
private Fragment temporaryFragment;

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

    getSupportFragmentManager().beginTransaction().add(R.id.frame_holder, new FragmentHomepage()).commit();

    bottom_navigation = findViewById(R.id.bottom_navigation);
    bottom_navigation.setSelectedItemId(R.id.action_home);
    bottom_navigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {

            if (item.getItemId() == R.id.action_home) {
                temporaryFragment = new FragmentHomepage();
            }
            if (item.getItemId() == R.id.action_gelir) {
                temporaryFragment = new FragmentGelir();
            }
            if (item.getItemId() == R.id.action_gider) {
                temporaryFragment = new FragmentGider();
            }

            getSupportFragmentManager().beginTransaction().replace(R.id.frame_holder, temporaryFragment).commit();

            return true;
        }
    });
}

}

anasdmr
  • 31
  • 3

3 Answers3

2

1- You can use interfaces, and share data with other fragments using your host activity as described here.

The developer document : https://developer.android.com/training/basics/fragments/communicating

2- You can use view model to share data between your fragments via your host activity. This is now recommended way of data sharing between fragments. To share data between fragments using view model.

https://developer.android.com/topic/libraries/architecture/viewmodel#sharing

Create a View Model Class :

// Item is your desired data type

    public class SharedViewModel extends ViewModel {
        private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
    
        public void select(Item item) {
            selected.setValue(item);
        }
        public LiveData<Item> getSelected() {
            return selected;
        }

In Your FragmentGelir :

public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
    itemSelector.setOnClickListener(item -> {
        model.select(item);
    });
}
    

    }

In your FragmentHomePage :

public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
    model.getSelected().observe(getViewLifecycleOwner(), item -> {
       // Update the UI.
    });
}

3- For basic usage of Hosting Activity

in Main Activity :

private DataType data;

public SetData(DataType data)
{
this.data = data;
}

public GetData()
{
return this.data;
}

in Fragment To Set Data :

((MainActivity) requireActivity()).SetData(data);

in Fragment To Get Data :

DataType data;
data = ((MainActivity) requireActivity()).GetData;
Eren Tüfekçi
  • 2,463
  • 3
  • 16
  • 35
  • thanks a lot for your answer, i am trying to solve this solution but i couldn't understand what is "requireActivity()" could you help me with that? thanks in advance – anasdmr Nov 07 '20 at 11:23
  • you can call host activity from your fragment. requireActivity() is your FragmentActivity – Eren Tüfekçi Nov 07 '20 at 11:32
  • Did you make it? – Eren Tüfekçi Nov 07 '20 at 18:39
  • thank you very much mr. Eren for your help. i am working on this issue since 9 in the morning :). but it didn't work again. but i think i can make with data passing from fragment to Mainactivity and then from Mainactivity to another fragment. this is long way but what else can i do ? – anasdmr Nov 07 '20 at 20:38
  • Yes, it is another way of transferring data. I recommend view modelling by the way. If you need help you can contact me – Eren Tüfekçi Nov 07 '20 at 20:41
1

Simply way to create static var in Activity and get it with

((MainActivity)getActivity()).MY_VAR
1

The scenario is like this :

In GelirFragment :

class GelirFragment extends Fragment {
            public void onClick() {
                Fragment homePageFragment = new HomePageFragment();
                Bundle bundle = new Bundle();
                bundle.putInt("someKey", value);
                fragment.setArguments(bundle);

                getFragmentManager()
                .beginTransaction()
                .replace(R.id.fragment_container, homePageFragment)
                .addToBackStack(null)
                .commit();
            }
}

In HomePageFragment :

class HomePageFragment extends Fragment {
      @Nullable
      @Override
      public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    
          Bundle args = getArguments();
          if (args != null) {
              Integer passedValue = arguments.getInt("someKey");
          }
          
          return view;
      }
    }
andika_kurniawan
  • 511
  • 4
  • 9
  • 20
  • Thanks a lot for your response. since i use BottomNavigationView ,i didn't work again. there are 3 fragments on Mainactivity, when i click "gelirfragment" it crashed. – anasdmr Nov 07 '20 at 11:19