我有一個導航抽屜和一個 Cardview 的 RecyclerView。我希望如果我單擊 Cardview 上的影像,我的 Fragment 會發生變化,但沒有任何反應這是代碼:
CardAdapter.java
public class CardAdapter extends FirebaseRecyclerAdapter<Spesa, CardAdapter.cardViewholder> {
// Constructor
public CardAdapter(
FragmentActivity activity, @NonNull FirebaseRecyclerOptions<Spesa> options){
super(options);
}
@Override
protected void
onBindViewHolder(@NonNull cardViewholder holder,
int position, @NonNull Spesa model)
{
holder.amount.setText(model.getDesc());
holder.who.setText(String.valueOf(model.getCosto()));
holder.Description.setText(model.getCategoria());
holder.modifica.setImageResource(R.drawable.edit);
String str = model.getchi();
if(model.getchi().equals("Francesco")){
holder.chiSpende.setImageResource(R.drawable.fra);
}
else if(model.getchi().equals("Angela")){
holder.chiSpende.setImageResource(R.drawable.angela);
}
holder.modifica.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AppCompatActivity activity = (AppCompatActivity) v.getContext();
Fragment myFragment = new InserisciSpesaFragment();
activity.getSupportFragmentManager().beginTransaction().replace(R.id.nav_resoconto, myFragment).addToBackStack(null).commit();
}
}
@NonNull
@Override
public cardViewholder
onCreateViewHolder(@NonNull ViewGroup parent,
int viewType)
{
View view
= LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_layout, parent, false);
return new CardAdapter.cardViewholder(view);
}
class cardViewholder extends RecyclerView.ViewHolder {
CardView cw;
TextView amount, who, Description;
ImageView chiSpende, cancella, modifica;
public cardViewholder(@NonNull View itemView)
{
super(itemView);
amount = itemView.findViewById(R.id.idAmount);
who = itemView.findViewById(R.id.idChiSpende);
Description = itemView.findViewById(R.id.idDescrizioneSpesa);
chiSpende = itemView.findViewById(R.id.ImgSpese);
cancella = itemView.findViewById(R.id.bin);
modifica = itemView.findViewById(R.id.edit);
cw = itemView.findViewById(R.id.myCardView);
});
modifica.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AppCompatActivity activity = (AppCompatActivity) v.getContext();
Fragment frag = new InserisciSpesaFragment();
activity.getSupportFragmentManager().beginTransaction()
.replace(R.id.nav_resoconto, frag).commit();
}
});
}
}
}
這是我想跳的類:InserisciSpesaFragment.java
public class InserisciSpesaFragment extends Fragment {
private Firebase mref;
FirebaseDatabase database = FirebaseDatabase.getInstance();
private InserisciSpesa inserisciSpesa;
private FragmentInserisciBinding binding;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
inserisciSpesa =
new ViewModelProvider(this).get(InserisciSpesa.class);
binding = FragmentInserisciBinding.inflate(inflater, container, false);
View root = binding.getRoot();
Button btn = (Button) binding.BtnInsert;
EditText txtcosto = (EditText) binding.EdittextCosto;
EditText txtdesc = (EditText) binding.EdittextSpesa;
Spinner spinCat = (Spinner) binding.spinnerCategorie;
Spinner spinChi = (Spinner) binding.spinnerChi;
DatePicker datePicker = (DatePicker) binding.DatePicker;
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
String my = (String) snapshot.getValue();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
};
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(!CampiVuoti(txtdesc.getText().toString(), txtcosto.getText().toString())){
Snackbar.make(view, "Attenzione, sono presenti campi vuoti!", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
else {
Spesa spesa = new Spesa(txtdesc.getText().toString(), Double.parseDouble(txtcosto.getText().toString()),
spinCat.getSelectedItem().toString(), spinChi.getSelectedItem().toString(),
datePicker.getDayOfMonth(), datePicker.getMonth() 1, datePicker.getYear());
addDatatoFirebase(spesa);
Snackbar.make(view, "Spesa inserita correttamente", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
}
});
inserisciSpesa.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
//textView.setText(s);
}
});
return root;
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
}
問題出在 onclick 中,尤其是在:
public void onClick(View v) {
Fragment frag = new InserisciSpesaFragment();
FragmentManager fm = frag.getActivity().getSupportFragmentManager();
fm.beginTransaction()
.replace(R.id.nav_resoconto, frag)
.commit();
}
Thisi 是mobile_navigation.xml的 xml 檔案
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@ id/mobile_navigation"
app:startDestination="@ id/nav_home">
<fragment
android:id="@ id/nav_home"
android:name="com.example.frangela.ui.home.HomeFragment"
android:label="@string/menu_home"
tools:layout="@layout/fragment_home" />
<fragment
android:id="@ id/nav_gallery"
android:name="com.example.frangela.ui.gallery.GalleryFragment"
android:label="@string/menu_gallery"
tools:layout="@layout/fragment_gallery" />
<fragment
android:id="@ id/nav_slideshow"
android:name="com.example.frangela.ui.slideshow.InserisciSpesaFragment"
android:label="@string/menu_slideshow"
tools:layout="@layout/fragment_inserisci" />
<fragment
android:id="@ id/nav_stipendio"
android:name="com.example.frangela.ui.stipendio.InserisciStipendioFragment"
android:label="@string/menu_stipendio"
tools:layout="@layout/fragment_stipendio" />
<fragment
android:id="@ id/nav_resoconto"
android:name="com.example.frangela.ui.resocard.ResocardFragment"
android:label="@string/Resoconto"
tools:layout="@layout/fragment_resocard" />
</navigation>
謝謝
uj5u.com熱心網友回復:
您正在創建新片段
Fragment frag = new InserisciSpesaFragment();
就在那之后,你試圖從中獲得Activity一個
FragmentManager fm = frag.getActivity().getSupportFragmentManager();
這個片段Activity在這個getActivity()呼叫的那一刻沒有被添加到任何片段中,你應該NullPointerException在這里得到一個......(崩潰,不僅僅是“什么都沒有發生”)
考慮保留對FragmentManager在建構式中獲取的參考
public class CardAdapter extends FirebaseRecyclerAdapter<Spesa, CardAdapter.cardViewholder> {
private FragmentManager fm;
// Constructor
public CardAdapter(FragmentActivity activity, @NonNull FirebaseRecyclerOptions<Spesa> options){
super(options);
fm = activity.getSupportFragmentManager();
}
然后onClick只是使用它而不是試圖從未添加的Fragment
public void onClick(View v) {
Fragment frag = new InserisciSpesaFragment();
//FragmentManager fm = frag.getActivity().getSupportFragmentManager();
fm.beginTransaction() // use fm obtained in constructor
.replace(R.id.nav_resoconto, frag)
.commit();
}
順便提一句。我懷疑這段代碼是否會像R.id.nav_resocontoXML 中已經宣告的片段的 id 一樣作業。replace(...)方法需要參考片段容器視圖(在名為 的檔案中containerViewId)。仔細閱讀檔案以進行正確的導航切換
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/424642.html
