关于android中自定义SurfaceView放在布局文件中的问题

首先先要明白一下关于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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值