在按钮上设置setOnClickListener时,从菜单项调用新活动并获取NPE

时间:2015-11-30 02:26:44

标签: android

我是Android开发的先驱,并试着亲自动手。

上下文: 编写一个基本的应用程序,它有多个菜单选项,所有选项都有一个与之关联的活动,所以当用户点击菜单选项然后我尝试启动一个活动,它有一些基本的表单小部件,如编辑文本,微调器和按钮。我能够使用菜单选项从一个活动导航到另一个活动

问题: 设置点击列表器以提交按钮时,我收到以下错误

  

尝试调用虚方法' void   android.widget.Button.setOnClickListener(android.view.View $ OnClickListener)'   在null对象引用上。

我尝试调试应用程序,发现我的小部件没有初始化,我尝试将此代码添加到onCreate,OnStart,OnResume 但得到相同的结果

以下是活动代码(这不是主要活动)

  public class AddCar extends AppCompatActivity {

    private EditText modelName;

    private Button addCar;
    private Button refreshBtn;
    private Spinner chooseBrandName;

    public final String LOG_TAG = AddCar.class.getSimpleName();

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

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_add, menu);
        return true;
    }

    @Override
    protected void onResume() {
        super.onResume();
        getAllWidgets();
        addListenerOnSubmitButton();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void addListenerOnSubmitButton(){

        addCar.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        String modelNameText = modelName.getText().toString();
                        String carBrand=chooseBrandName.getSelectedItem().toString();

                        Log.d(LOG_TAG,modelNameText);
                        Log.d(LOG_TAG,carBrand);

                    }
                }
        );
    }

    public void getAllWidgets(){

        Log.d(LOG_TAG,"getAllWidgets called");

        addCar=(Button)findViewById(R.id.btnCarAdd);
        refreshBtn=(Button)findViewById(R.id.btnCarRefresh);
        modelName=(EditText)findViewById(R.id.modelName);
        chooseBrandName=(Spinner)findViewById(R.id.brandNames);


    }
}

此活动的xml代码为

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#000000">


<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="10dp">

    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.40"
        android:text="@string/CAR_BRAND"
        android:textColor="#CCCCCC" />

    <Spinner
        android:layout_width="0dp"
        android:id="@+id/brandNames"
        android:layout_height="wrap_content"
        android:entries="@array/brand_names"
        android:prompt="@string/CHOOSE_CAR"
        android:layout_weight="0.60"
        android:background="#CCCCCC" />

</LinearLayout>

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="10dp">

    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.40"
        android:text="@string/CAR_MODEL_NAME"
        android:textColor="#CCCCCC"/>

    <EditText
        android:id="@+id/modelName"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.60"
        android:ems="10"
        android:background="#CCCCCC" />
</LinearLayout>


<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="10dp">

    <View
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.40"
        android:textColor="#CCCCCC"/>

    <Button
        android:id="@+id/btnCarAdd"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.375"
        android:text="@string/CAR_ADD_BUTTON" />

    <Button
        android:id="@+id/btnCarRefresh"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.375"
        android:text="@string/CAR_REFRESH_BUTTON" />
</LinearLayout>

1 个答案:

答案 0 :(得分:0)

您的按钮为空,您正在获取NullPointerException,因为您尝试在空按钮上调用setOnClickListener。

您的按钮为空的原因是因为它实际上未在您的getAllWidgets()调用中找到。原因是你没有在onCreate中调用setContentView()。

试试这个:

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

    setContentView(R.layout.my_layout);

}