将数据从片段传递到另一个片段

时间:2020-11-07 10:09:41

标签: java android android-fragments android-recyclerview fragment

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

我尝试了bundle和interface,但是没有一个起作用。您能帮我吗,我将不胜感激 我想从该片段传递数据,其名称为“ 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;
        }
    });
}

}

3 个答案:

答案 0 :(得分:2)

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;

答案 1 :(得分:1)

在Activity中创建静态变量并通过以下方式获取的简单方法

((MainActivity)getActivity()).MY_VAR

答案 2 :(得分:1)

这种情况是这样的:

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

在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;
      }
    }
相关问题