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.
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()
@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;
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 :)
Podobne pytania
Nowe pytania
android
Android to mobilny system operacyjny Google, używany do programowania lub tworzenia urządzeń cyfrowych (smartfony, tablety, samochody, telewizory, Wear, Glass, IoT). W przypadku tematów związanych z Androidem użyj tagów specyficznych dla Androida, takich jak android-intent, android-activity, android-adapter itp. W przypadku pytań innych niż programowanie lub programowanie, ale związanych ze strukturą Androida, użyj tego linku: https: // android.stackexchange.com.