![](/img/trans.png)
[英]Passing data from fragment to another fragment. Fragment not attached to a context
[英]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.