首先先要明白一下关于SurfaceView的基本知识
详见下面几篇博客文章:
http://www.cnblogs.com/xuling/archive/2011/06/06/android.html
http://158067568.iteye.com/blog/905495
http://blog.csdn.net/hellogv/article/details/5985090
http://blog.csdn.net/you_and_me12/article/details/7259759
http://blog.csdn.net/qiuchenl/article/details/6987179
本人遇到的问题代码如下:
public class HebbTestActivity extends Activity {
/** Called when the activity is first created. */
NumViewIn numViewIn = null;
NumViewOut numViewOut = null;
Button comfirm = null;
Button count_w = null;
Button identify = null;
List<Matrix> inMatrixlist = new LinkedList<Matrix>();
List<Matrix> outMatrixlist = new LinkedList<Matrix>();
Matrix W = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
double[][] p1 =
{{-1, 1, 1, 1,-1},
{-1,-1, 1,-1,-1},
{-1,-1, 1,-1,-1},
{-1,-1, 1,-1,-1},
{-1,-1, 1,-1,-1},
{-1, 1, 1, 1,-1}};
//numViewIn = new NumViewIn(this); numView 也能正常显示,但是在点击按钮事件处理时却始终无法正常调用其中的方法
numViewIn = (NumViewIn)findViewById(R.id.viewin);
numViewOut = (NumViewOut)findViewById(R.id.viewout);
numViewIn.setArry(p1,6,5);
comfirm = (Button)findViewById(R.id.confirm);
count_w = (Button)findViewById(R.id.count_w);
identify = (Button)findViewById(R.id.identify);
//numViewIn.surfaceCreated(numViewIn.getHolder());
//numViewIn.drawArry(p1);
//监听确认标准输入输出按钮事件
comfirm.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
//Matrix in = Hebb.arrayToMatrix(numViewIn.getArry(), 6, 5);
//Matrix out = Hebb.arrayToMatrix(numViewOut.getArry(), 6, 5);
//inMatrixlist.add(in);
//outMatrixlist.add(out);
double[][] p1 =
{{ 1,-1,-1,-1, 1},
{-1, 1,-1, 1,-1},
{-1,-1, 1,-1,-1},
{-1, 1,-1, 1, 1},
{ 1,-1,-1,-1,-1},
{-1, 1,-1, 1,-1}};
//numViewIn.arry = p1;
Log.v("ListSiza",String.valueOf(numViewIn.getArry()));
numViewIn.setArry(p1,6,5);
//numViewIn.setArry(p1, 6, 5);
//Log.v("ListSiza2",String.valueOf(numViewIn.getArry()));
//numViewIn.drawArry();
}
});
//监听计算权值矩阵W按钮事件
count_w.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
//W = Hebb.heddGetW(inMatrixlist, outMatrixlist);
}
});
//识别当前输入
identify.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
Matrix in = Hebb.arrayToMatrix(numViewIn.getArry(), 6, 5);
Matrix out = Hebb.heddGetA(in, W);
numViewOut.drawArry(Hebb.MatrixToArray(out, 6, 5));
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/bg"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/menu_bg_white_2"
android:gravity="center"
android:orientation="horizontal"
android:padding="2dip" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="1dip"
android:text="线性联想器-Hebb规则"
android:textColor="#2d2e2e"
android:textSize="25sp" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dip"
android:gravity="center"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/btn_style_two_normal"
android:gravity="center"
android:orientation="horizontal"
android:padding="7dip" >
<com.vagi.main.NumViewIn
android:id="@+id/viewin"
android:layout_width="175dip"
android:layout_height="210dip" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:text="标准输入"
android:textColor="#F5F5F5"
android:textSize="23sp" />
<Button
android:id="@+id/clear"
android:layout_width="80dip"
android:layout_height="45dp"
android:layout_gravity="center_horizontal"
android:text="清空"
android:textColor="#2d2e2e"
android:textSize="20sp" >
</Button>
<Button
android:id="@+id/confirm"
android:layout_width="80dip"
android:layout_height="45dp"
android:layout_gravity="center_horizontal"
android:text="确认"
android:textColor="#2d2e2e"
android:textSize="20sp" >
</Button>
<Button
android:id="@+id/xinxi"
android:layout_width="80dip"
android:layout_height="45dp"
android:layout_gravity="center_horizontal"
android:text="个数"
android:textColor="#2d2e2e"
android:textSize="20sp" >
</Button>
</LinearLayout>
</LinearLayout>
</LinearLayout>
其中在控件进行初始化时:
若这样进行初始化numViewIn = new NumViewIn(this);
numView 也能正常显示,但是在点击按钮事件处理时却始终无法调用其中的方法进行绘制,
原因是numView的holder.lockCanvas()返回值为空,即此时还不能进行绘制View的操作;
若这样则没有问题
numViewIn = (NumViewIn)findViewById(R.id.viewin);
看来在用XML作为布局的activity中,
findViewById()和new方法在控件的初始化时区别是比较大的.
在官方文档中的说明如下
public View findViewById(int id)
Finds a view that was identified by the id attribute from the XML that was processed in onCreate(Bundle).
Returns
The view if found or null otherwise.
有人说:findViewById 不是创建. 创建过程一般在setContentView(int id)的时候. find只是找.
如果前面没有setContentView,调用findviewbyid会返回一个Null.
看来这次的问题还是在于用new新建SurfaceView对象不适合用在以XML文件作为主视图的activity中,不同的构造方法有很大的区别,如果是以SurfaceView作为ContentView用new方法就比较可行.
初步推测是因为各个View之间的关系不好确定的原因.
以下是拓展阅读:
http://blog.csdn.net/pfgmylove/article/details/7562346