Pracowałem nad aplikacją, w której użytkownik logowałby się do działania, a szuflada nawigacji zawierałaby fragmenty „Mój profil”, „Strona główna” i „Ustawienia”. Logując się, przekazuję „imię” i „adres e-mail” konta pobranego z bazy danych tak, żebym mógł je wyświetlić we fragmencie „Mój profil”, ale nie mogłem przekazać NAZWISKA odzyskanego w działaniu LOGIN do Mojego profilu Fragment.

Kod z aktywności logowania

    Bundle bundle = new Bundle();
    bundle.putString("first", extraName);
    ProfileFragment myProfile = new ProfileFragment();
    myProfile.setArguments(bundle);

Kod z ProfileFragment

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle bundle = this.getArguments();
            String name = bundle.getString("first");
            Log.i("PASSED: ","hello " + name);
            Toast.makeText(getActivity(),"Hello " + name, Toast.LENGTH_SHORT);
        return inflater.inflate(R.layout.fragment_js_profile, container, false);
}

Zawsze otrzymuję odwołanie do obiektu Error Null

Process: com.example.myapplication, PID: 31888

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
    at com.example.myapplication.JobSeeker.ProfileFragment.onCreateView(ProfileFragment.java:27)

    at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
    at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
    at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
    at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
    at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
    at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

Dziękuję, przepraszam za kiepski angielski.

1
A S 20 listopad 2019, 13:10
Log.i("ZAKOŃCZONO: "," cześć " + uchwyt); co tu klamka???
 – 
Jeeva
20 listopad 2019, 13:13
Pakiet wydaje się być pusty, sprawdź czy zawiera ciąg za pomocą metody hasExtra
 – 
Jeeva
20 listopad 2019, 13:16
@Jeeva, przepraszam, to musi być IMIĘ
 – 
A S
20 listopad 2019, 13:31
Jak dodać ProfileFragment?
 – 
Bracadabra
20 listopad 2019, 13:39
Co masz na myśli dodając ProfileFragment? przepraszam. To fragment w jednym ćwiczeniu, właśnie dostałem go z samouczka na youtube. teraz nie mogę przekazać danych z aktywności do fragmentu
 – 
A S
20 listopad 2019, 13:43

3 odpowiedzi

Wspomnij, że Twój fragment jest w tej samej aktywności lub w innej aktywności.
Zgodnie z Twoim pytaniem, Twój kod fragmentu znajduje się w niewłaściwej metodzie lub funkcji, którą próbujesz wydrukować lub uzyskać ciąg, nawet jeśli view nie został utworzony.

override onActivityCreated() wewnątrz swojego fragmentu i umieść w nim te wiersze kodu.

Bundle bundle = this.getArguments();
            String name = bundle.getString("first");
            Log.i("PASSED: ","hello " + name);
            Toast.makeText(getActivity(),"Hello " + name, Toast.LENGTH_SHORT);

I nie przeszkadzaj niczego w metodzie onCreateView(), po prostu wytnij powyżej tej linii kodu i wklej do onActivityCreated()

0
USMAN osman 20 listopad 2019, 13:42
Mój fragment jest w HomeActivity dostępny po zalogowaniu się na LoginActivity. Dane znajdują się w działaniu domowym, w którym znajdują się fragmenty, ale nie mogę uzyskać do nich dostępu z klasy Java „ProfileFragment.java”
 – 
A S
20 listopad 2019, 13:49
Czyli mówisz technicznie, że masz dwie czynności... jedną do logowania i drugą, która ma fragment. Prawidłowy? I uprzejmie daj mi znać, czy wypróbowałeś powyższe rozwiązanie
 – 
USMAN osman
20 listopad 2019, 14:13
Tak, próbowałem, nadal nie działało :( dziękuję. Właśnie stworzyłem tę Szufladę Nawigacyjną z fragmentami za pomocą youtube, ale nie do końca rozumiałem, jak to działa
 – 
A S
20 listopad 2019, 14:26
Ok, teraz zmagaj się trochę bardziej, Zaktualizuj swoje pytanie i dodaj cały kod XML, wszystkie fragmenty i pełny kod zajęć z nazwą klas. Wtedy twój punkt widzenia będzie bardziej zrozumiały.
 – 
USMAN osman
20 listopad 2019, 14:45
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View view= inflater.inflate(R.layout.fragment_js_profile, container, false);
    Bundle bundle = getArguments();
            String name = bundle.getString("first");
            Log.i("PASSED: ","hello " + name);
            Toast.makeText(getActivity(),"Hello " + name, Toast.LENGTH_SHORT);
        return view;
0
Khalid Saeed 20 listopad 2019, 13:53

Dziękuję za wszystkie odpowiedzi, mój błąd był w kodzie obudowy przełącznika

            case R.id.nav_profile:
            String name = getIntent().getStringExtra("name");
            Bundle bundle = new Bundle();
            bundle.putString("name", name);
            profileFragment.setArguments(bundle);
            manager.beginTransaction().replace(R.id.fragment_container, new ProfileFragment())
                    .commit();
            break;

Przepraszam, że nie wysłałem tego wcześniej, wysyłałem dane o mojej metodzie onCreate i umieściłem NEW ProfileFragment (), który kontynuował tworzenie nowego fragmentu i powinno być tak

            case R.id.nav_profile:
            String name = getIntent().getStringExtra("name");
            ProfileFragment profileFragment = new ProfileFragment();
            Bundle bundle = new Bundle();
            bundle.putString("name", name);
            profileFragment.setArguments(bundle);
            manager.beginTransaction().replace(R.id.fragment_container, profileFragment)
                    .commit();
            break;

Wszystkie Twoje odpowiedzi pomogły! Dziękuję Ci :)

0
A S 20 listopad 2019, 16:28