当我将元素绑定到其中时,为什么我的代码总是收到空指针异常?我在 Android Studio 中使用 Java

Why is my code always receiving a null pointer exception when I have binded the element in to it? I am using Java in Android Studio

我收到了 java.lang.NullPointerException,虽然我已经正确绑定了元素。

试图检查元素的 ID,它匹配,但我仍然收到相同的异常。

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


    //Text to Speech
    tts = new TextToSpeech(this, this);

    speakButton = findViewById(R.id.speakButton);

    speechText = findViewById(R.id.speechText);

    speakButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            speakOut();
        }
    });
    // End

    loadFragment(new HomeFragment());

    BottomNavigationView navigation = findViewById(R.id.navigation);
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
}

TranslatorFragment.java
public class TranslatorFragment extends Fragment {

public Button speakButton;

public TranslatorFragment(){
    //Empty Constructor
}

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.translator_fragment, container, false);
}

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    speakButton = view.findViewById(R.id.speakButton);
}

}

应该 运行 没问题,但我收到 java.lang.NullPointerException

您的按钮代码应该在您的片段中而不是在您 activity 中声明,因为按钮在您的 fragment.xml 中。当您访问 activity 的 onCreate 方法中的按钮时,它将给出空指针异常,因为您的片段视图尚未 rendered.The 最佳做法是在片段的 onViewCreated 函数中访问视图。

MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
loadFragment(new HomeFragment());

    BottomNavigationView navigation = findViewById(R.id.navigation);
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
}

TranslatorFragment.java
public class TranslatorFragment extends Fragment {

public Button speakButton;

public TranslatorFragment(){
    //Empty Constructor
}

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.translator_fragment, container, false);
}

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

     //Text to Speech
    tts = new TextToSpeech(getActivity(), this);

    speakButton = findViewById(R.id.speakButton);

    speechText = findViewById(R.id.speechText);

    speakButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            speakOut();
        }
    });
    // End
}
void speakOut(){
}

解决方案是在项目中实现TextToSpeech.OnInitListener,将public变量设为私有

public class TranslatorFragment extends Fragment implements TextToSpeech.OnInitListener{

private Button speakButton; // public Button speakButton;
private TextToSpeech tts;
private EditText speechText; // public EditText speechText;

public TranslatorFragment(){
    //Empty Constructor
}

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.translator_fragment, container, false);
}

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    tts = new TextToSpeech(getActivity(), this);
    speakButton = view.findViewById(R.id.speakButton);
    speechText = view.findViewById(R.id.speechText);
    speakButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            speakOut();
        }
    });
}

private void speakOut(){
    String text = speechText.getText().toString();
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}

public void onInit(int status){
    if(status == TextToSpeech.SUCCESS){
        int result = tts.setLanguage(Locale.getDefault());

        if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED){
            Toast.makeText(getActivity(), "Language not supported!", Toast.LENGTH_SHORT).show();
        } else {
            speakButton.setEnabled(true);
            speakOut();
        }
    }
    else
    {
        Toast.makeText(getActivity(), "Initilization failed!", Toast.LENGTH_SHORT).show();
    }
}

public void onDestroy() {
    if(tts != null){
        tts.stop();
        tts.shutdown();
    }
    super.onDestroy();
}

}