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.

enter image description here

0
Greg 20 listopad 2019, 19:26
Gdzie jest wyjście logcat?
 – 
SomethingCool
20 listopad 2019, 19:42
Właśnie to dodałem :)
 – 
Greg
20 listopad 2019, 19:54

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);.

0
JDG 20 listopad 2019, 19:50

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;

        }
0
Kévin Giacomino 20 listopad 2019, 19:52
Cześć, dziękuję za odpowiedź, nadal otrzymuję ten sam wyjątek w moim logcat ;)
 – 
Greg
20 listopad 2019, 19:57

Nie przekazuj wartości bezpośrednio z fragmentu do fragmentu.

Powinieneś użyć setArguments z SettingsFragment i getArguments w HomeFragment

0
GuanHongHuang 20 listopad 2019, 19:56
Mówisz więc coś takiego: Bundle b= new Bundle(); b.putInt("resID", R.drawable.torso2green); UstawieniaFragment.this.setArguments(b);
 – 
Greg
20 listopad 2019, 20:17
Tak.W 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.
 – 
GuanHongHuang
20 listopad 2019, 20:46
Dziękuję :) Zaktualizowałem moje rozwiązanie, ale nie sądzę, aby fragment awatara był nawet wywoływany po kliknięciu przycisku. Jakieś pomysły ?
 – 
Greg
20 listopad 2019, 21:12