Fragment中EditText小部件的NullPointerException

时间:2016-06-20 18:11:35

标签: android nullpointerexception android-edittext

我对Android App Dev很陌生,所以错误可能很简单,但是我的代码在我的代码行中抛出了NullPointerException

    String reactant = reactants.getText().toString();

我假设这是因为"反应物" EditText小部件在其声明中仍为null,但我不明白为什么,因为我在onCreateView()方法中声明了它。任何关于我应该如何解决这个问题的帮助将不胜感激。

这是我的java和布局XML代码。

爪哇

    public class stoich_fragment extends Fragment
    {
    View rootview;
    int i = 0;
    int l = 0;
    ArrayList<Integer> arr = new ArrayList<>();
    ArrayList<String> elements = new ArrayList<>();
    boolean getElements = true;
    String s = "";
    String element = "";
    EditText reactants;
    TextView beq;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        rootview = inflater.inflate(R.layout.stoich_layout, container, false);
        reactants = (EditText) rootview.findViewById(R.id.reactants);
        beq = (TextView) rootview.findViewById(R.id.balanced_equation);
        return rootview;
    }
    String reactant = reactants.getText().toString();
    //saying that reactants is null even after it went through the onCreateView method
    String re = reactant.replaceAll("\\s+","");
    public void getReactants()
    {
        while(getElements)
        {
            String let = re.substring(i, i+1);
            if(let.compareTo(let.toLowerCase()) > 0)
            {
                element += let;
                i++;
            }
            else if(let.compareTo(let.toLowerCase()) == 0)
            {
                element += let;
                i++;
            }
            else if (let.equals("0")||let.equals("1")||let.equals("2")||let.equals("3")||let.equals("4")||let.equals("5")||let.equals("6")||let.equals("7")||let.equals("8")||let.equals("9"))
            {
                int temp = Integer.parseInt(let);
                arr.add(temp);
                elements.add(element);
                element = "";
            }
            else if(i > re.length()-1)
            {
                getElements = false;
            }
        }
        // displays the elements isolated on the reactant side
        // to test to make sure my logic works
        for(int a = 0; a<re.length(); a++)
        {
            s += elements.get(a) + " : " + arr.get(a) + "\n";
        }
        beq.setText(s);
    }
    } 

XML

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"        android:layout_height="match_parent">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/reactants"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="95dp"
        android:textSize="20sp"
        android:inputType="text" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/products"
        android:layout_alignBottom="@+id/reactants"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:textSize="20sp"
        android:inputType="text" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/balanced_equation"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:textSize="30sp" />
<!--should make text bold and black-->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Balancing Equations"
        android:id="@+id/title"
        android:textSize="35sp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

3 个答案:

答案 0 :(得分:1)

您在任何方法之外声明String reactant = reactants.getText().toString();,这意味着它将在执行onCreateView()方法之前执行,这是您持有此视图的布局的膨胀。您无法访问视图以设置/获取其内容,直到其被夸大为止。解决方案是在这些行之后的某个时间调用String reactant = reactants.getText().toString();

rootview = inflater.inflate(R.layout.stoich_layout, container, false);
reactants = (EditText) rootview.findViewById(R.id.reactants);

当然,如果你没有在任何文本中输入字符串,那么字符串将是空的,但这至少可以让你合法地检查而不会得到NullPointerException。

答案 1 :(得分:1)

仅仅因为垂直书写的代码并不意味着它是垂直执行的。

你基本上已经完成了这个

EditText reactants; // <--- Null here
String reactant = reactants.getText().toString(); // <-- error here
String re = reactant.replaceAll("\\s+","");

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    rootview = inflater.inflate(R.layout.stoich_layout, container, false);
    reactants = (EditText) rootview.findViewById(R.id.reactants);
    beq = (TextView) rootview.findViewById(R.id.balanced_equation);
    return rootview;
}

解决方案是将导致错误的行移动到需要String变量的方法中。

答案 2 :(得分:0)

你在类级别调用String reactant = reactants.getText().toString();(就像你在onCreateView上面移动它一样),这意味着它在调用类中的任何方法之前发生,所以onCreateView还没有发生, textview没有被夸大 - 所以你在一个空变量上调用getText。