Java 尝试在Android片段中查找按钮ID时引发NPE

Java 尝试在Android片段中查找按钮ID时引发NPE,java,android,android-fragments,nullpointerexception,Java,Android,Android Fragments,Nullpointerexception,无论我重复了多少次,这个问题都会反复出现。根据Android开发者的说法,片段的视图层次结构中的对象ID是在onCreateView中获得的,我在这里讨论的所有问题都证实了这一点。但是,由于某些原因,在检查“我已设置”期间,它总是返回null,因此我无法继续使用按钮。片段在这个项目的“决策事件”期间被加载,每个事件都有不同的决策。因此,我只想使用一个片段,并根据需要更改按钮文本。然而,我似乎无法让它们不返回null。我只是需要帮助来找出我做错了什么导致了NPE DecisionFragment.

无论我重复了多少次,这个问题都会反复出现。根据Android开发者的说法,片段的视图层次结构中的对象ID是在onCreateView中获得的,我在这里讨论的所有问题都证实了这一点。但是,由于某些原因,在检查“我已设置”期间,它总是返回null,因此我无法继续使用按钮。片段在这个项目的“决策事件”期间被加载,每个事件都有不同的决策。因此,我只想使用一个片段,并根据需要更改按钮文本。然而,我似乎无法让它们不返回null。我只是需要帮助来找出我做错了什么导致了NPE

DecisionFragment.java:

package com.saphiric.simproject.uimanipulation;

import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import com.saphiric.simproject.R;
import com.saphiric.simproject.datacontrols.DataCore;

public class DecisionFragment extends Fragment {

    // Activity/Global variables
    private static final String TAG = "DecisionFragment";
    DataCore dataCore = DataCore.getInstance();

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

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.i(TAG, "Begin: Inflate");

        // Gets handles to important UI elements for scalability
        View root = inflater.inflate(R.layout.fragment_decision, container, false);
        Button buttonTrue = (Button) root.findViewById(R.id.btnChoiceOne);
        Button buttonFalse = (Button) root.findViewById(R.id.btnChoiceTwo);


        if(buttonTrue == null){
            System.out.println("buttonTrue is null");
        } else {
            System.out.println("buttonTrue is working fine");
        }

        Log.i(TAG, "Finished: Inflate");
        if (root == null){
            Log.e(TAG, "omg Inflate == null");
        }
        switch (dataCore.controller.getCurrentDecision()){
            case "OPSDecision":
//                buttonTrue.setText(R.string.ops_decision_one);
//                buttonFalse.setText(R.string.ops_decision_two);
                break;
            default:
                System.out.println("ERROR: No decision set");
        }
        return root;
    }

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

    }
}
fragment_decision.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="90dp"
    android:orientation="horizontal"
    android:weightSum="1.0"
    tools:context="com.saphiric.simproject.uimanipulation.DecisionFragment">

    <Button
        android:id="@+id/decisionOne"
        android:layout_width="0dp"
        android:layout_height="90dp"
        android:layout_weight=".5"
        android:text="@string/defaul_btn"
        android:onClick="cryingDecisionOne"/>

    <Button
        android:id="@+id/decisionTwo"
        android:layout_width="0dp"
        android:layout_height="90dp"
        android:layout_weight=".5"
        android:text="@string/defaul_btn"
        android:onClick="cryingDecisionTwo"/>
</LinearLayout>

您在代码中使用了错误的ID!布局中的按钮id为
decisionOne
decisionTwo
,但在代码中使用的是
btnChoiceOne
btnChoiceTwo

要修复它,请替换此:

Button buttonTrue = (Button) root.findViewById(R.id.btnChoiceOne);
Button buttonFalse = (Button) root.findViewById(R.id.btnChoiceTwo);
在您的
决策片段中包含以下内容:

Button buttonTrue = (Button) root.findViewById(R.id.decisionOne);
Button buttonFalse = (Button) root.findViewById(R.id.decisionTwo);

代码中的按钮id与xml布局中的按钮id不匹配。

在xml中,id是“decisionOne”,但代码正在寻找“R.id.btnChoiceOne”

哦,天哪,我真是太尴尬了,我甚至不得不发布这篇文章。谢谢你。
Button buttonTrue = (Button) root.findViewById(R.id.decisionOne);
Button buttonFalse = (Button) root.findViewById(R.id.decisionTwo);