所以我试图为Android制作一个非常简单的MVC应用程序。Observer 实现和 Observable 正确扩展,所以一切都是花花公子。但是,每当我运行应用程序时,我都会收到 NullPointerException。谁能弄清楚为什么?我想念的东西一定很简单。
activity_main.xml
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/nameView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:text="@string/hello_world"
android:textAppearance="?android:attr/textAppearanceMedium" />
<Button
android:id="@+id/nameSet"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:text="@string/change"
android:layout_marginTop="20dp"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/storeView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:text="@string/hello_world"
android:layout_marginTop="80dp"
android:textAppearance="?android:attr/textAppearanceMedium" />
<Button
android:id="@+id/storeSet"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:text="@string/change"
android:layout_marginTop="100dp"
android:textAppearance="?android:attr/textAppearanceMedium" />
</RelativeLayout>
</ScrollView>
MainActivity.java
public class MainActivity extends Activity implements Observer{
private ClipboardModel model;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.model = new ClipboardModel();
System.out.println(this.model.getName());
this.model.addObserver(this);
//redraw();
setContentView(R.layout.activity_main);
}
@Override
public void update(Observable arg0, Object arg1) {
redraw();
}
private void redraw(){
TextView nameView = (TextView)findViewById(R.id.nameView);
nameView.setText(this.model.getName());
TextView storeView = (TextView)findViewById(R.id.storeView);
storeView.setText(this.model.getStore());
}
/*
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}*/
}
ClipboardModel.java
public class ClipboardModel extends Observable{
private String name;
private String store;
private int[] a;
private int[] b;
private int[] c;
private int[] d;
private int[] e;
private int[] g;
private int[] h;
private int[] f;
private int[] w;
private int[] s;
private int[] l;
private int[] p;
private int[] v;
private int[] x;
private int ldw;
private int pai;
private int pep;
private int ali;
private int cpp;
private int gps;
private int rsn;
private int fuel;
private int xm;
private int cs;
/**
* Constructor for ClipboardModel
*/
public ClipboardModel(){
this.a = new int[3];
this.b = new int[3];
this.c = new int[3];
this.d = new int[3];
this.e = new int[3];
this.g = new int[3];
this.h = new int[3];
this.f = new int[3];
this.w = new int[3];
this.s = new int[3];
this.l = new int[3];
this.p = new int[3];
this.v = new int[3];
this.x = new int[3];
this.ldw = 0;
this.pai = 0;
this.pep = 0;
this.ali = 0;
this.cpp = 0;
this.gps = 0;
this.rsn = 0;
this.fuel = 0;
this.xm = 0;
this.cs = 0;
this.name = "Name";
this.store = "Store";
}
/**
* Add a car to the appropriate array
* @param type - Category of car
* @param clean - whether or not the car is clean
*/
public void addCar(String type, boolean clean){
if(type.equals("a")){
this.a[0]++;
if(clean)
this.a[1]++;
else
this.a[2]++;
}
else if(type.equals("b")){
this.b[0]++;
if(clean)
this.b[1]++;
else
this.b[2]++;
}
else if(type.equals("c")){
this.c[0]++;
if(clean)
this.c[1]++;
else
this.c[2]++;
}
else if(type.equals("d")){
this.d[0]++;
if(clean)
this.d[1]++;
else
this.d[2]++;
}
else if(type.equals("e")){
this.e[0]++;
if(clean)
this.e[1]++;
else
this.e[2]++;
}
else if(type.equals("g")){
this.g[0]++;
if(clean)
this.g[1]++;
else
this.g[2]++;
}
else if(type.equals("b")){
this.h[0]++;
if(clean)
this.h[1]++;
else
this.h[2]++;
}
else if(type.equals("f")){
this.f[0]++;
if(clean)
this.f[1]++;
else
this.f[2]++;
}
else if(type.equals("w")){
this.w[0]++;
if(clean)
this.w[1]++;
else
this.w[2]++;
}
else if(type.equals("s")){
this.s[0]++;
if(clean)
this.s[1]++;
else
this.s[2]++;
}
else if(type.equals("l")){
this.l[0]++;
if(clean)
this.l[1]++;
else
this.l[2]++;
}
else if(type.equals("p")){
this.p[0]++;
if(clean)
this.p[1]++;
else
this.p[2]++;
}
else if(type.equals("v")){
this.v[0]++;
if(clean)
this.v[1]++;
else
this.v[2]++;
}
else if(type.equals("x")){
this.x[0]++;
if(clean)
this.x[1]++;
else
this.x[2]++;
}
setChanged();
notifyObservers();
}
/**
* Remove a car from the appropriate array
* @param type - Category of car
* @param clean - Whether or not the car is clean
*/
public void removeCar(String type, boolean clean){
if(type.equals("a")){
this.a[0]--;
if(clean)
this.a[1]--;
else
this.a[2]--;
}
else if(type.equals("b")){
this.b[0]--;
if(clean)
this.b[1]--;
else
this.b[2]--;
}
else if(type.equals("c")){
this.c[0]++;
if(clean)
this.c[1]--;
else
this.c[2]--;
}
else if(type.equals("d")){
this.d[0]--;
if(clean)
this.d[1]--;
else
this.d[2]--;
}
else if(type.equals("e")){
this.e[0]--;
if(clean)
this.e[1]--;
else
this.e[2]--;
}
else if(type.equals("g")){
this.g[0]--;
if(clean)
this.g[1]--;
else
this.g[2]--;
}
else if(type.equals("b")){
this.h[0]--;
if(clean)
this.h[1]--;
else
this.h[2]--;
}
else if(type.equals("f")){
this.f[0]--;
if(clean)
this.f[1]--;
else
this.f[2]--;
}
else if(type.equals("w")){
this.w[0]--;
if(clean)
this.w[1]--;
else
this.w[2]--;
}
else if(type.equals("s")){
this.s[0]--;
if(clean)
this.s[1]--;
else
this.s[2]--;
}
else if(type.equals("l")){
this.l[0]--;
if(clean)
this.l[1]--;
else
this.l[2]--;
}
else if(type.equals("p")){
this.p[0]--;
if(clean)
this.p[1]--;
else
this.p[2]--;
}
else if(type.equals("v")){
this.v[0]++;
if(clean)
this.v[1]--;
else
this.v[2]--;
}
else if(type.equals("x")){
this.x[0]--;
if(clean)
this.x[1]--;
else
this.x[2]--;
}
setChanged();
notifyObservers();
}
/**
* Add a CSI
* @param type - type of CSI to add
*/
public void addCSI(String type){
if(type.equals("ldw"))
this.ldw++;
else if(type.equals("pai"))
this.pai++;
else if(type.equals("pep"))
this.pep++;
else if(type.equals("ali"))
this.ali++;
else if(type.equals("cpp"))
this.cpp++;
else if(type.equals("gps"))
this.gps++;
else if(type.equals("rsn"))
this.rsn++;
else if(type.equals("fuel"))
this.fuel++;
else if(type.equals("xm"))
this.xm++;
else if(type.equals("cs"))
this.cs++;
setChanged();
notifyObservers();
}
/**
* Remove a CSI
* @param type - type of CSI to remove
*/
public void removeCSI(String type){
if(type.equals("ldw"))
this.ldw--;
else if(type.equals("pai"))
this.pai--;
else if(type.equals("pep"))
this.pep--;
else if(type.equals("ali"))
this.ali--;
else if(type.equals("cpp"))
this.cpp--;
else if(type.equals("gps"))
this.gps--;
else if(type.equals("rsn"))
this.rsn--;
else if(type.equals("fuel"))
this.fuel--;
else if(type.equals("xm"))
this.xm--;
else if(type.equals("cs"))
this.cs--;
setChanged();
notifyObservers();
}
/**
* Setter for name
* @param name - Employee name
*/
public void setName(String name){
this.name = name;
setChanged();
notifyObservers();
}
/**
* Setter for store
* @param store - Store name
*/
public void setStore(String store){
this.store = store;
setChanged();
notifyObservers();
}
/**
* Getter for name
* @return this.name
*/
public String getName(){
return this.name;
}
/**
* Getter for store
* @return
*/
public String getStore(){
return this.store;
}
}
错误发生在方法 redraw() 中 MainActivity.java 的第 29 行。第 28-29 行状态:
TextView nameView = (TextView)findViewById(R.id.nameView);
nameView.setText(this.model.getName());
任何解决错误的帮助将不胜感激!谢谢!