Próbuję zaimplementować LayoutInflater za przycisk, ale po wykonaniu tego błędu otrzymuję ten błąd. Nie jestem pewien, czy został on wdrożony prawidłowo, czy nie. Próbowałem różnych rozwiązań dostępnych do tego samego pytania, ale nadal, będąc nowym na Androida, trudno jest rozwiązać ten problem.

HTTPS: //www.dropbox.com/s/s2K92N6SS4MTZTG/screenRecorder-2020-11-23-00-34-16-139.mp4?dl=0 (przepraszam za nie w stanie wyjaśnić przepływu pracy, ale patrz Ten klips do lepszego zrozumienia, pierwsza aktywność jest wprowadzeniem i wzmacniacz; ostatni jeden przycisk Start jest na pokładzie

Proszę zrzucić trochę światła. Dziękuję Ci!

wprowadzenieActivity.java :

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_introductory);
     
    ............

    **//The button from fragment_on_boarding3**
    start_l=findViewById(R.id.startb);

    .............

    **//Having issue with this part**

    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View layoutScreen = inflater.inflate(R.layout.fragment_on_boarding3,null);

    start_l.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent mainActivity = new Intent(getApplicationContext(),MainActivity.class);
            startActivity(mainActivity);

          // I need to save a boolean value to storage so next time when the user runs the app,I could know that he has already checked the intro screen activity
          // I'm going to use shared preferences forthat process
            
            savePrefsData();
            finish();
        }
    });
}

 private boolean restorePrefData() {
        SharedPreferences pref = getApplicationContext().getSharedPreferences("myPrefs",MODE_PRIVATE);
        Boolean isIntroActivityOpnendBefore = pref.getBoolean("isIntroOpnend",false);
        return  isIntroActivityOpnendBefore;
}


private void savePrefsData() {

    SharedPreferences pref = getApplicationContext().getSharedPreferences("myPrefs",MODE_PRIVATE);
    SharedPreferences.Editor editor = pref.edit();
    editor.putBoolean("isIntroOpnend",true);
    editor.commit();

}

}

na przybieraniuFragment3.java :

public class OnBoardingFragment3 extends Fragment {

Context mContext ;
Button start;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    ViewGroup root=(ViewGroup) inflater.inflate(R.layout.fragment_on_boarding3,container,false);

    return root;
}    

fragment_on_boarding3.xml :

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
       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:layout_width="match_parent"
       android:layout_height="match_parent">

         <Button android:id="@+id/startb"
    android:layout_width="157dp"
    android:layout_height="59dp"
    android:fontFamily="@font/bungee"
    android:text="Let's Start"
    android:textSize="15dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.498"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.754" />
     
    </androidx.constraintlayout.widget.ConstraintLayout>

Błąd:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.liq/com.example.liq.IntroductoryActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2946) at....................
0
aditya 22 listopad 2020, 21:03

1 odpowiedź

Najlepsza odpowiedź

findViewById jest w rzeczywistości nazywany:

this.findViewById(someId);

this odnosi się do aktywności (w swoim przypadku IntroductoryActivity);

Z Dokumenty:

Znajduje widok, który został zidentyfikowany przez Atrybut Androida: ID XML, który został przetworzony w OnCreate (pakiet).

Ta metoda onCreate() to onCreate metoda aktywności, na której dzwonisz findViewById. W twoim przypadku, identyfikator (i widoku) należy do fragmentu, więc aktywność nie może znaleźć widoku powiązanego z tym identyfikatorem i zwraca null, a otrzymasz NPE, gdy chcesz setOnClickListener do start_l przycisk.

Możesz ustawić OnClicklistener do tego przycisku wewnątrz onViewCreated Metoda fragmentu:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
  super.onViewCreated(view, savedInstanceState);
  start_l=view.findViewById(R.id.startb);
  start_l.setOnClickListener.......
  
}

Edytuj: Sugestia Prince Ali jest również możliwa i może lepsza droga do tego. Możesz zainicjować widoki wewnątrz onCreateView:

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    ViewGroup root=(ViewGroup) inflater.inflate(R.layout.fragment_on_boarding3,container,false);
    start_l=root.findViewById(R.id.startb);
    start_l.setOnClickListener.......
    return root;
}

Polecam też patrząc na to Post

1
Tuqay 23 listopad 2020, 16:07