Search code examples
androidcrashandroid-edittexttextviewtranslate

"App name" keeps stopping when I click the "TRANSLATE" button.


So I'm trying to get user input using EditText and display the text into TextView once the "translate" button is clicked. Below is my class containing the source code. Please do help ! I need to be able to extract the input from the user successfully before I extract it to be translated using Google Cloud API this is why I'm just trying to extract and show it through TextView for now but it doesn't seem to be working for now...

public class Translator extends Fragment {

    public Spinner spinner1, spinner2;
    TextView textView;
    EditText texttotranslate;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.translator, container, false);

    getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);

    ImageButton switchbutton;
    Button translatebutton;

    //Both Spinner's Languages
    String [] Languages =
            {"English","Malay","Chinese","Korean","Japanese","Arabic","Indonesian","Spanish"};

    //LanguageFromSpinner
    spinner1 = (Spinner) view.findViewById(R.id.languagefromspinner);
    ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_spinner_item, Languages);
    adapter1.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
    spinner1.setAdapter(adapter1);

    //LanguageToSpinner
    spinner2 = (Spinner) view.findViewById(R.id.languagetospinner);
    ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_spinner_item, Languages);
    adapter2.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
    spinner2.setAdapter(adapter2);

    //Button to switch language between spinner1 & spinner2
    switchbutton = (ImageButton) view.findViewById(R.id.languageswitchButton);
    switchbutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int spinner1Index = spinner1.getSelectedItemPosition();

            spinner1.setSelection(spinner2.getSelectedItemPosition());
            spinner2.setSelection(spinner1Index );
        }
    });

    //Button to translate
    translatebutton = (Button) view.findViewById(R.id.translatebutton);

    translatebutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            textView = (TextView) getView().findViewById(R.id.translatedtext);
            texttotranslate = (EditText) v.findViewById(R.id.translatetextinput);
            String textstorage = texttotranslate.getText().toString();
            textView.setText(textstorage);
        }
    });


 --------- beginning of crash
09-26 10:43:59.824 6294-6294/project.myapplication E/AndroidRuntime: FATAL 
EXCEPTION: main
    Process: project.myapplication, PID: 6294
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
    at project.myapplication.Translator$2.onClick(Translator.java:90)
    at android.view.View.performClick(View.java:6294)
    at android.view.View$PerformClick.run(View.java:24770)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Solution

  • The stacktrace indicates that your EditText was null when you tried to call its getText() method.

    In your event handler, you call:

    texttotranslate = (EditText) v.findViewById(R.id.translatetextinput);
    

    In this context, v is the view that fired the click event, aka the button. You're trying to find a view inside your button which has the id translatetextinput.

    You probably meant to write:

    texttotranslate = (EditText) getView().findViewById(R.id.translatetextinput);
    

    which will look for the view in the entire fragment's view hierarchy.