-2

私のコードは大丈夫ですが、残念ながら私のコードはnullポインタ例外を与えます。findviewbyidの前にsetcontentviewを書くことによってそれが起こらないことを知っていますが、そうすることによって私の表面は更新されません。私はこれについてたくさん検索しようとしましたが、これに対する適切な答えを得ることができません。

package com.example.snakes;

public class MainActivity extends Activity implements View.OnClickListener{

MySurfaceClass sc;
Button up,down,left,right;
//View v1,v2;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    sc = new MySurfaceClass(this);
    //setContentView(R.layout.activity_main);

    up = (Button) findViewById(R.id.button1);
    down = (Button) findViewById(R.id.button2);
    left = (Button) findViewById(R.id.button3);
    right = (Button) findViewById(R.id.button4);

    up.setOnClickListener(this);
    down.setOnClickListener(this);
    left.setOnClickListener(this);
    right.setOnClickListener(this);
    setContentView(R.layout.activity_main);

    // Toast.makeText(this, "done", Toast.LENGTH_SHORT).show();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

public void onClick(View v) {
    switch(v.getId()){
    case R.id.button1:
        sc.posY = sc.posY - 50 ;
        Toast.makeText(this, "up", Toast.LENGTH_SHORT).show();
    //   sc = new MySurfaceClass(this);
      //   setContentView(R.layout.activity_main);
        break;

    case R.id.button2:
        sc.posY = sc.posY + 50 ;
        Toast.makeText(this, "down", Toast.LENGTH_SHORT).show();
        // sc = new MySurfaceClass(this);
         //setContentView(R.layout.activity_main);
        break;

    case R.id.button3:
        sc.posX = sc.posX - 50 ;
        Toast.makeText(this, "left", Toast.LENGTH_SHORT).show();
        //sc = new MySurfaceClass(this);
        //setContentView(R.layout.activity_main);
        break;

    case R.id.button4:
        sc.posX = sc.posX + 10 ;
        Toast.makeText(this, "right", Toast.LENGTH_SHORT).show();
        //setContentView(R.layout.activity_main);
        break;
    }
}
}

一方、表面活動のコード:-

package com.example.snakes;


public class MySurfaceClass extends SurfaceView implements Runnable {

private SurfaceHolder sh;
private Thread t = null;
private boolean isRunning;
private Bitmap b;
protected int posX, posY;

public MySurfaceClass(Context context) {
    super(context);
    init();
}

public MySurfaceClass(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public MySurfaceClass(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}

void init() {
    isRunning = true;
    b = BitmapFactory.decodeResource(getResources(), R.drawable.face);
    posX = 0;
    posY = 0;
    sh = this.getHolder();
    t = new Thread(this);
    t.start();
};

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawRect(100, 100, 100, 100, null);
}

public void run() {
    while (isRunning) {
        if (!sh.getSurface().isValid())
            continue;

        Canvas c = sh.lockCanvas();
        c.drawRGB(5, 150, 10);
        c.drawBitmap(b, posX, posY, null);
        sh.unlockCanvasAndPost(c);
    }
}
  }

とxml:-

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



<LinearLayout
    android:id="@+id/view1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/grey"
    android:weightSum="100" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="up" 
        android:layout_weight="25"/>

    <Button
        android:id="@+id/button2"
        android:layout_weight="25"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="down" />

    <Button
        android:id="@+id/button3"
        android:layout_weight="25"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="left" />

    <Button
        android:id="@+id/button4"
        android:layout_weight="25"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="right" />
</LinearLayout>

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.example.snakes.MySurfaceClass
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/surfaceView"
        />
</FrameLayout>

4

2 に答える 2

2

findViewByIdを使用してウィジェットへの参照を取得する前に、setContentViewメソッドを呼び出す必要があります。そうしないと、クリックリスナーをボタンに設定するときにNullPointerExceptionsが発生します。

最初にボタンを機能させてから、表面のビューについて心配します。

于 2012-11-18T17:13:18.287 に答える
0

あなたのコードは壊れています。そうsetContentView()しないと、ビューが添付されません。

于 2012-11-18T17:14:18.673 に答える