最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

java - Trying to send data to another fragment but when I press the button it closes the app - Stack Overflow

programmeradmin5浏览0评论

I am trying to make an app where it controls the aspects of a garden. changing the temperature, the humidity, wind, and etc. Right now I am starting with temperature and I do not understand what I am doing wrong here is my code. This is the thermometer fragment and its supposed to send data to the home fragment and determine the number that was inputted by the user should turn on the heat or cool off the garden

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

Button enter = view.findViewById(R.id.btTemp);
    enter.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            EditText degrees = view.findViewById(R.id.nmDegrees);
            Bundle onOrOff = new Bundle();
            onOrOff.putInt("df1", Integer.parseInt(degrees.getText().toString()));
            getParentFragmentManager().setFragmentResult("dataFromThermometer", onOrOff);
            degrees.setText("");
        }
    });

    return view;
    }
}

//this is the home fragment
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_home, container, false);
        // Inflate the layout for this fragment

        getParentFragmentManager().setFragmentResultListener("dataFromThermometer", this, new FragmentResultListener() {
            @Override
            public void onFragmentResult(@NonNull String requestKey, @NonNull Bundle onOrOff) {
                int temP = onOrOff.getInt("df1");
                TextView temp = view.findViewById(R.id.tvTemp);

                if(temP < 72){
                    temp.setText("Heat On!");
                }
                if(temP > 72) {
                    temp.setText("Cool Off");
                }
            }
        });
        return view;
    }
}

I have tried resyncing gradle files but my app keeps closing when i click the button. This is the error logcat gives me:

2025-03-10 22:44:21.775 27891-27891/com.example.weathergarden E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.weathergarden, PID: 27891
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
        at com.example.weathergarden.ThermometerFragment$1.onClick(ThermometerFragment.java:82)
        at android.view.View.performClick(View.java:8033)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131)
        at android.view.View.performClickInternal(View.java:8010)
        at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
        at android.view.View$PerformClick.run(View.java:31336)
        at android.os.Handler.handleCallback(Handler.java:991)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loopOnce(Looper.java:232)
        at android.os.Looper.loop(Looper.java:317)
        at android.app.ActivityThread.main(ActivityThread.java:8787)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:591)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:871)
2025-03-10 22:44:21.793 27891-27891/com.example.weathergarden I/Process: Sending signal. PID: 27891 SIG: 9

I am trying to make an app where it controls the aspects of a garden. changing the temperature, the humidity, wind, and etc. Right now I am starting with temperature and I do not understand what I am doing wrong here is my code. This is the thermometer fragment and its supposed to send data to the home fragment and determine the number that was inputted by the user should turn on the heat or cool off the garden

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

Button enter = view.findViewById(R.id.btTemp);
    enter.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            EditText degrees = view.findViewById(R.id.nmDegrees);
            Bundle onOrOff = new Bundle();
            onOrOff.putInt("df1", Integer.parseInt(degrees.getText().toString()));
            getParentFragmentManager().setFragmentResult("dataFromThermometer", onOrOff);
            degrees.setText("");
        }
    });

    return view;
    }
}

//this is the home fragment
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_home, container, false);
        // Inflate the layout for this fragment

        getParentFragmentManager().setFragmentResultListener("dataFromThermometer", this, new FragmentResultListener() {
            @Override
            public void onFragmentResult(@NonNull String requestKey, @NonNull Bundle onOrOff) {
                int temP = onOrOff.getInt("df1");
                TextView temp = view.findViewById(R.id.tvTemp);

                if(temP < 72){
                    temp.setText("Heat On!");
                }
                if(temP > 72) {
                    temp.setText("Cool Off");
                }
            }
        });
        return view;
    }
}

I have tried resyncing gradle files but my app keeps closing when i click the button. This is the error logcat gives me:

2025-03-10 22:44:21.775 27891-27891/com.example.weathergarden E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.weathergarden, PID: 27891
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
        at com.example.weathergarden.ThermometerFragment$1.onClick(ThermometerFragment.java:82)
        at android.view.View.performClick(View.java:8033)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131)
        at android.view.View.performClickInternal(View.java:8010)
        at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
        at android.view.View$PerformClick.run(View.java:31336)
        at android.os.Handler.handleCallback(Handler.java:991)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loopOnce(Looper.java:232)
        at android.os.Looper.loop(Looper.java:317)
        at android.app.ActivityThread.main(ActivityThread.java:8787)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:591)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:871)
2025-03-10 22:44:21.793 27891-27891/com.example.weathergarden I/Process: Sending signal. PID: 27891 SIG: 9
Share edited Mar 12 at 6:14 dthorbur 1,1493 gold badges13 silver badges26 bronze badges asked Mar 11 at 3:11 IsaIsa 193 bronze badges 0
Add a comment  | 

1 Answer 1

Reset to default 0

The crash is caused by a NullPointerException when calling getText() on degrees. This happens because you are trying to find R.id.nmDegrees using view.findViewById(), but view in this context is your Button enter, not the fragment's root view.

You can fix this by defining degrees outside the setOnClickListener() scope:

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

    View view = inflater.inflate(R.layout.fragment_thermometer, container, false);

    Button enter = view.findViewById(R.id.btTemp);
    EditText degrees = view.findViewById(R.id.nmDegrees); // Find nmDgrees EditText from root view

    enter.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Bundle onOrOff = new Bundle();
            onOrOff.putInt("df1", Integer.parseInt(degrees.getText().toString()));

            getParentFragmentManager().setFragmentResult("dataFromThermometer", onOrOff);
            degrees.setText("");
           
        }
    });

    return view;
}
发布评论

评论列表(0)

  1. 暂无评论