我是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>
答案 0 :(得分:0)
您的按钮为空,您正在获取NullPointerException,因为您尝试在空按钮上调用setOnClickListener。
您的按钮为空的原因是因为它实际上未在您的getAllWidgets()调用中找到。原因是你没有在onCreate中调用setContentView()。
试试这个:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_layout);
}