Chcę móc kliknąć przycisk na moim fragmencie ustawień, który zmieni obraz na innym fragmencie zwanym fragmentem domowym. Moja aplikacja zawiesza się po kliknięciu przycisku i nie wiem dlaczego.
Fragment ustawień:
public class SettingsFragment extends Fragment {
public Button button;
public ImageView Torso;
public ImageView ShopGreenTorso;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
button = (Button) getView().findViewById(R.id.button1);
Torso = (ImageView) getView().findViewById(R.id.Torso);
ShopGreenTorso= (ImageView) getView().findViewById(R.id.ShopGreenTorso);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getActivity(), "Purchased", Toast.LENGTH_SHORT).show();
Intent i = new Intent(SettingsFragment.this.getActivity(), AvatarFragment.class);
//i.putExtra("resID", R.drawable.torso2green);
Bundle b= new Bundle();
b.putInt("resID", R.drawable.torso2green);
SettingsFragment.this.setArguments(b);
//setArguments(bundle);
startActivity(i);
}
});
}
Fragment awatara:
public class AvatarFragment extends Fragment {
public ImageView IV;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
View rootView = inflater.inflate(R.layout.fragment_avatar, container, false);
// init image view
IV = (ImageView) rootView.findViewById( R.id.Torso );
// getting extras
//Bundle bundle = getActivity().getIntent().getExtras();
// Bundle bundle=getArguments();
Bundle b=getArguments();
if(b!= null)
{
int resid = b.getInt("resID");
IV.setBackgroundResource(resid);
}
return rootView;
}
}
Uważam, że błąd pochodzi z IV.setImageResource (Resid), ale nie jestem do końca pewien, jakakolwiek pomoc byłaby bardzo mile widziana.
3 odpowiedzi
Trudno to stwierdzić bez zauważenia wyjątku, ale może to być spowodowane tym, że w mapowaniu pakietów jest rozróżniana wielkość liter.
Twój SettingsFragment
używa „ResId”, ale HomeFragment
oczekuje „ResID”. Jeśli w pakiecie nie zostanie znalezione żadne mapowanie, otrzymasz domyślną wartość 0 dla resID
. Możliwe, że zawieszasz się podczas dzwonienia pod numer IV.setImageResource(0);
.
Twoja implementacja obrazu w kodzie jest nieprawidłowa, musisz zainicjować widok obrazu w następujący sposób:
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
View rootView = inflater.inflate(R.layout.fragment_avatar, container, false);
// init image view
IV = (ImageView) rootView.findViewById( R.id.Torso );
// getting extras
Bundle bundle = getActivity().getIntent().getExtras();
if(bundle!= null)
{
int resid = bundle.getInt("resId");
IV.setImageResource(resid);
}
return rootView;
}
Nie przekazuj wartości bezpośrednio z fragmentu do fragmentu.
Powinieneś użyć setArguments
z SettingsFragment i getArguments
w HomeFragment
SettingsFragment
, gdy przycisk onClick, oddzwoń do Aktywności i przekaż swoją wartość, a następnie użyj setArguments
w Aktywności, w której dokonujesz transkacji do AvatarFragment
, na koniec użyj getArguments
w AvatarFragment
, aby uzyskać wartość, którą przekazujesz z SettingsFragment
.
Podobne pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].