簡體   English   中英

將數據從片段傳遞到另一個片段

[英]Passing data From Fragment to another 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;
        }
    });
}

}

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- 對於 Hosting Activity 的基本使用

在主要活動中:

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;

在 Activity 中創建靜態變量並使用它的簡單方法

((MainActivity)getActivity()).MY_VAR

場景是這樣的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM