0

別のビューを前面に表示しようとすると、ここで例外が発生します。私のBoardViewクラスの最後のメソッドでif(lives == 0)と表示されます。誰も私がこのbringToFrontメソッドをどこから呼び出さなければならないのか誰にでも見られますか?あなたが右のスレッドでフロントに持参実行する必要が間違ったスレッド例外から呼び出されました

public class BoardView extends SurfaceView implements SurfaceHolder.Callback{ 
Context mContext; 

// thread initialization 
private BoardThread thread; 
Thread timer; 

// box variables 
Bitmap box = 
    (BitmapFactory.decodeResource 
      (getResources(), R.drawable.box)); 
private int box_x = 140; 
private int box_y = 378; 
private int boxWidth = box.getWidth(); 
private int boxHeight = box.getHeight(); 

// storage 
private Vector<Blossom> blossomVector = new Vector<Blossom>(); 
Iterator<Blossom> dataIterator = blossomVector.iterator(); 

// counters 
private int blossomNum = 0; 
private String score; 
private int currentScore = 0; 
private int lives = 3; 

boolean mode = false; 
boolean game = false; 

OutputStreamWriter out = null; 
FileOutputStream fOut = null; 

private static final String TAG = "Debug"; 
final Paint scorePaint = new Paint(); 

public BoardView(Context context){ 
    super(context); 

    scorePaint.setColor(Color.BLACK); 
    scorePaint.setTextSize(12); 
    scorePaint.setTypeface(Typeface.MONOSPACE); 


    //surfaceHolder provides canvas that we draw on 
    getHolder().addCallback(this); 

    // controls drawings 
    thread = new BoardThread(getHolder(),this, blossomVector, dataIterator, box_x, box_y, 
      boxWidth, boxHeight); 

    timer = new Thread(){ 
     public void run(){ 
      //makes sure the player still has 3 lives left 
      while(game == false){ 
       uiCallback.sendEmptyMessage(0); 
       try { 
        Thread.sleep(2000); // wait two seconds before drawing the next flower 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } //sleep for 2 seconds 
      } 
     } 
    }; 
    timer.start(); 

    //intercepts touch events 
    setFocusable(true); 

} 

@Override 

public void onDraw(Canvas canvas){ 
    canvas.drawColor(Color.WHITE); 
    score = "SCORE: " + currentScore; 

    //note: pay attention to order you draw things 
    //don't change order or else blossoms will fall 
    //on top of box, not "into" it. 

    //display the scoreboard 
    canvas.drawText(score,240,420,scorePaint); 
    // uses a synchronized method to prevent concurrent modification 
    DrawBlossoms(canvas); 
    canvas.drawBitmap(box, box_x, box_y, null); 

} 

@Override 
public boolean onTouchEvent(MotionEvent event){ 
    //handles movement of box 
    if(event.getAction() == MotionEvent.ACTION_DOWN){ 
     if(event.getX() > box_x & event.getY() > box_y & 
       event.getX() < box_x + boxWidth & event.getY() < box_y + boxHeight) 
     { 
      mode = true; 
     } 
    } 

    if(event.getAction() == MotionEvent.ACTION_MOVE) { 
     if(event.getX() > box_x & event.getY() > box_y & 
       event.getX() < box_x + boxWidth & event.getY() < box_y + boxHeight) 
     { 
      mode = true; 
     } 
     if(mode == true){ 
      box_x = (int)event.getX(); 
     } 

    } 

    if(event.getAction() == MotionEvent.ACTION_UP){ 
     mode = false; 
    } 

    invalidate(); 
    return true; 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, 
     int format, int width, int height){ 
    Log.v(TAG, "Surface Changed"); 
    //somehow these don't seem to be working 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder){ 
    thread.startRunning(true); 
    thread.start(); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder){ 
    Log.v(TAG, "Surface Destroyed"); 
    //somehow these don't seem to be working 
    thread.startRunning(false); 
    thread.stop(); 
    timer.interrupt(); 
    timer.stop(); 
} 

private Handler uiCallback = new Handler(){ 
    public synchronized void handleMessage(Message msg){ 
     //add a new blossom to the blossom Vector!! 
     blossomVector.add(new Blossom( 
      (BitmapFactory.decodeResource 
        (getResources(), R.drawable.blossom)))); 
     dataIterator = blossomVector.iterator(); 
     blossomNum++; 
     Log.v(TAG, "Number of Blossoms =" + blossomNum); 
    } 
}; 

private synchronized void DrawBlossoms(Canvas c) // method to draw flowers on screen and test for collision 
{ 
    Canvas canvas = c; 
    dataIterator = blossomVector.iterator(); 
    while (dataIterator.hasNext()) 
    { 
     Blossom tempBlossom = dataIterator.next(); 
     tempBlossom.Draw(canvas); 
     if (tempBlossom.hit(box_x,box_y, box_x + boxWidth, box_y + boxHeight, blossomVector) == true) 
     { 
      Log.v(TAG, "ITERATOR WORKS!"); 
      dataIterator.remove(); 
      currentScore += 100; 
     } 

     if (tempBlossom.dropped() == true) 
     { 
      dataIterator.remove(); 
      Log.v(TAG, "Blossom dropped"); 
      lives--; 
     } 
     if (lives == 0) 
     { 
      // END THE GAME!!! 
      ((BoardView) getParent()).findViewById(1).bringToFront(); 
     } 

    } 
} 

public void writeFile() 
{ 
} 

}

public class BoardThread extends Thread { 

private SurfaceHolder surfaceHolder; 
private BoardView boardView; 

private Vector<Blossom> blossomVector; 
private int boxX; 
private int boxY; 
private int boxWidth; 
private int boxHeight; 
private boolean mrun =false; 
private Iterator<Blossom> iterator; 

private static final String TAG = "Debug"; 

public BoardThread(SurfaceHolder holder, BoardView boardView2, 
     Vector<Blossom> blossomVector1, Iterator<Blossom> dataIterator, 
     int box_x, int box_y, int boxW, int boxH) { 

    surfaceHolder = holder; 
    boardView=boardView2; 

    blossomVector = blossomVector1; 
    iterator = dataIterator; 
    boxX = box_x; 
    boxY = box_y; 
    boxW = boxWidth; 
    boxH = boxHeight; 
} 

public void startRunning(boolean run) { 

    mrun=run; 
} 

@Override 
public void run() { 

    super.run(); 
    Canvas canvas; 
    while (mrun) { 
     canvas=null; 
     try { 
      canvas = surfaceHolder.lockCanvas(null); 
       synchronized (surfaceHolder) { 
       //update position 
       //Position(blossomVector, boxX, boxY, boxWidth, boxHeight); 
       // draw flowers 
       boardView.onDraw(canvas); 
      } 
     } finally { 
       if (canvas != null) { 
       surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
    } 

private synchronized void Position(Vector<Blossom> blossomVector,int box_x, int box_y, 
     int boxWidth, int boxHeight) 
{ 
    //for(Blossom blossom: blossomVector) 
    iterator = blossomVector.iterator(); 
    while (iterator.hasNext()) 
    { 
     Blossom tempBlossom = iterator.next(); 
     tempBlossom.UpdatePosition(); 

    } 
} 

} 


public class Board extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 

    //use a frame layout so you can also display a dialog box 
    // allows more than one view to be used 
    FrameLayout f1 = new FrameLayout(this); 
    LinearLayout l1 = new LinearLayout(this); 
    EditText edit = new EditText(this); 

    l1.setOrientation(LinearLayout.VERTICAL); 
    l1.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT)); 
    edit.setText("Enter your name!"); 
    l1.setId(1); 
    l1.addView(edit); 


    f1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
      LayoutParams.FILL_PARENT)); 
    f1.addView(l1); 
    f1.addView(new BoardView(this)); 

    setContentView(f1); 

    //setContentView(new BoardView(this)); 
} 

}

答えて

5

。試してみてください:

final View v = ((BoardView) getParent()).findViewById(1); 
v.post(new Runnable(){ public void run(){ v.bringToFront(); } }); 

これが機能するかどうかを確認してください。

+0

同じエラーが発生しました。私は別の場所からそれを呼び出すべきですか? –

+1

非常に奇妙です:FrameLayoutを作成した元のアクティビティを追跡し、そのアクティビティでハンドラを使用して 'bringToFront'を実行する必要があるかもしれません。 – Femi

+0

何が必要なのでしょうか?私は本当にこれがどのように難しいか分かりません:(私はAndroidプログラミングにとって本当に新しいので、これは私にとって本当に面倒です。 –

0

UIスレッド(SurfaceViewスレッドではありません)を使用してビューを更新する必要があります。 SurfaceViewスレッド内からいくつかのViewを変更したい場合は、Viewの更新を実行する新しいRunOnUiThreadを作成する必要があります。

// From within SurfaceView thread 
new Thread() { 
    public void run() { 
     activity.runOnUiThread(new Runnable() {  
      @Override 
      public void run() { 
       // Update view here 
      } 
     }); 
    } 
}.start(); 
関連する問題