为什么下面的代码抛出空指针异常?

时间:2015-04-04 16:39:51

标签: android nullpointerexception

所以我在活动中有一个弹出窗口的代码如下:

private void initiatePopupWindow(String popupText, boolean hasEditText){
    LayoutInflater inflater = (LayoutInflater) PlayActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final View layout= inflater.inflate(R.layout.popup_layout, (ViewGroup) findViewById(R.id.popup_layout));
    final PopupWindow popupWindow= new PopupWindow(layout, 300, 370, true);
    findViewById(R.id.play_activity_layout).post(new Runnable() {
        @Override
        public void run() {
            popupWindow.showAtLocation(layout, Gravity.CENTER, 0, 0);
        }
    });

    TextView textPopup= (TextView) layout.findViewById(R.id.tvPopupText);
    textPopup.setText(popupText);

   if(hasEditText) {
       EditText et = (EditText) findViewById(R.id.etNumber);
       MAX_NUMBER_OF_MOVES = Integer.parseInt(et.getText().toString());
   }

    btnClosePopup= (Button) layout.findViewById(R.id.btnClosePopup);
    btnClosePopup.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            popupWindow.dismiss();
            //finish();
        }
    });
}

我得到此行的NullPointerException:

MAX_NUMBER_OF_MOVES = Integer.parseInt(et.getText().toString());

我试图通过在网站上搜索想法来解决这个问题,但仍然不知道为什么它不合适。

编辑:

我的popup_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/popup_layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#444444"
    android:orientation="vertical"
    android:padding="10sp" >

    <TextView
        android:id="@+id/tvPopupText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5sp"
        android:text="@string/under_construction"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"/>

    <Button
        android:id="@+id/btnClosePopup"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="@string/ok"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"/>

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/etNumber"
        android:inputType="number"
        android:layout_alignRight="@+id/tvPopupText"/>

</RelativeLayout>

3 个答案:

答案 0 :(得分:2)

我认为你必须使用

EditText et = (EditText) layout.findViewById(R.id.etNumber);

请参阅layout.缺失。

请注意,getText()永远不会返回null。所以只有findViewById才会引发NullPointerException。

答案 1 :(得分:1)

尝试改变这一点:

final View layout= inflater.inflate(R.layout.popup_layout, (ViewGroup) findViewById(R.id.popup_layout));

另一个:

// container = get it from param of onCreateView  
final View layout= inflater.inflate(R.layout.popup_layout, container);
...
EditText et = (EditText) layout.findViewById(R.id.etNumber);

答案 2 :(得分:0)

在您修复layout.findViewById ....

之后

将EditText初始化为某个默认值...请参阅android:text =&#34; 0&#34;以下

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/etNumber"
    android:inputType="number"
    android:layout_alignRight="@+id/tvPopupText"
    android:text="0"
    />

如果string_value不是有效数字,你还应该总是在try / catch块中包装Integer.parseInt(&#34; string_value&#34;):

try {
    MAX_NUMBER_OF_MOVES = Integer.parseInt(et.getText().toString());
}
catch (NumberFormatException nfe_) {
    MAX_NUMBER_OF_MOVES = 5; // Or whatever your default number should be
}
相关问题