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