首页 > 解决方案 > 将数据从 Fragment 传递到另一个 Fragment

问题描述

我正在寻找数周,但我无法解决我的问题。我想将数据从一个片段传递到另一个片段。

我尝试使用捆绑包和界面,但它们都不起作用。你能帮我解决这个问题吗?我会很感激我想从这个片段中传递数据,它的名字是“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();
}

}

这是我的第二个片段,它应该获取数据“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;
}

}

这是我的 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;
        }
    });
}

}

标签: javaandroidandroid-fragmentsandroid-recyclerviewfragment

解决方案


1-您可以使用接口,并使用此处描述的主机活动与其他片段共享数据。

开发者文档:https ://developer.android.com/training/basics/fragments/communicating

2-您可以使用视图模型通过您的主机活动在您的片段之间共享数据。这是现在推荐的片段之间数据共享的方式。使用视图模型在片段之间共享数据。

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

创建一个视图模型类:

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

在您的 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);
    });
}
    

    }

在您的 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-托管活动的基本用法

在主要活动中:

private DataType data;

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

public GetData()
{
return this.data;
}

在片段中设置数据:

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

在片段中获取数据:

DataType data;
data = ((MainActivity) requireActivity()).GetData;

推荐阅读