当我尝试更改按钮的状态时,发生NullPointerException

时间:2019-09-18 04:47:09

标签: android android-fragments nullpointerexception

enter image description here

我正在制作具有3个片段和1个活动的应用程序。

我想要

如果单击名为“ FragmentOper”的片段上的按钮,

活动中名为“ FragmentMain”的两个按钮被禁用。

我已经在互联网上进行搜索,发现自己很简单。

FragmentMain.java

public class FragmentMain extends AppCompatActivity {
    public static Button BtnInit, btnOper, btnGraph;

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        btnInit = (Button) findViewById(R.id.button1);
        btnOper = (Button) findViewById(R.id.button2);
        btnGraph = (Button) findViewById(R.id.button3);

        setContentView(R.layout.activity_fragment); // added
        FragmentMain.context = FragmentMain.this; // added
}
// added to stack Overflow codes
public void changeFragment(View view){
        int id = view.getId();
        Fragment fragment = null;

        switch (id){
            case R.id.button1:
            fragment = new FragmentInit();
            break;

            case R.id.button2:
                fragment = new FragmentOper();
                break;

            case R.id.button3:
                fragment = new FragmentGraph();
                break;
        }

        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.fragment, fragment);
        fragmentTransaction.commit();
    }

public void changeState(boolean state){
        FragmentMain.btnGraph.setEnabled(state);
        FragmentMain.btnInit.setEnabled(state);
   }
}

FragmentOper.java

public class FragmentOper extends Fragment{
    public Button mStartBtn;

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

        View myView = inflater.inflate(R.layout.fragment_oper, container, false);

        mStartBtn = (Button) myView.findViewById(R.id.startBtn);

mStartBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View myView) {

                if (isTimerRunning) // STOP
                {
                    mStartBtn.setText("START");
                    isTimerRunning = false;
                    timerHandler.removeCallbacks(timerRunnable);
                    ((FragmentMain)getActivity()).changeState(true);


                } else {
                    mStartBtn.setText("PAUSE"); // Working
                    startTimer();
                    ((FragmentMain)getActivity()).changeState(false);
                }
            }
        });
return myView;
}

但是有java.lang.NullPointerException:尝试在'FragmentMain'的changeState中的空对象引用错误上调用虚拟方法'void android.widget.Button.setEnabled(boolean)'

启动该应用程序时,我按了btnINIT和btnGRAPH,它可以正常工作。

在我添加((FragmentMain)getActivity())。changeState(true);之前在onclicklistener中,效果很好。

所以我不明白为什么会有NullPointerException。

我从来没有在其他地方声明过Buttons。

如何解决?

1 个答案:

答案 0 :(得分:0)

您缺少

setContentView(R.layout.activity_main);

活动中的{p和setContentView必须在按钮被声明之前