简体   繁体   中英

Passing data From Fragment to another fragment

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;
        }
    });
}

}

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;

在 Activity 中创建静态变量并使用它的简单方法

((MainActivity)getActivity()).MY_VAR

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;
      }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM