2017-03-26 23 views
0

練習として、9個の乱数がある9個のボタンを「下に」表示する一種のtictactoe Androidアプリを書いています。ユーザーはボタンをクリックしてペアを見つけなければなりません。Android:ボタンをクリックした後の動作

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

} 



//Shows the About Game screen 
public void showAboutGame(View v) 
{ 
    setContentView(R.layout.about_game); 
} 

public void showGame(View v) 
{ 
    setContentView(R.layout.gameplay); 
    GridView gv = (GridView)findViewById(R.id.gridView); 
    ImageButtonAdapter iba = new ImageButtonAdapter(this); 
    gv.setAdapter(iba); 
} 

ImageButtonAdapterは、各ボタン

for(int i=0;i<buttons.length;i++){ 
     if(buttons[i]==null) buttons[i] = new ImageButton(c); 
     buttons[i].setOnClickListener(new ButtonOnClickListener(c, buttonValueSet.get(i), i, this)); 
    } 

ためonClickListenerを設定します:私はネット上で見つけた三目並べのサンプルを適応してい として、私はImageButtonAdapterをこのように呼び出すMainActivityを持っていますButtonOnClickListenerは、値のイメージをクリックしたボタンに設定します。アダプターでcheckHit()メソッドを使用するために、ImageButtonAdapter(this)への参照を送信しようとしました:

public class ButtonOnClickListener implements View.OnClickListener { 
int value; 
int index; 
ImageButtonAdapter adapter; 
int foundPairs; 
int previousValue; 
boolean firstClick = true; 
int firstNumber; 
private Context context; 

//Constructor 
public ButtonOnClickListener(int value, int index, ImageButtonAdapter adapter) { 
    this.value = value; 
    this.index = index; 
    this.adapter = adapter; 
} 

@Override 
public void onClick(View v) { 
    ImageButton btn = (ImageButton) v; 
    switch (value) { 
     case 1: 
      btn.setBackgroundResource(R.drawable.n_1); 
      break; 
     case 2: 
      btn.setBackgroundResource(R.drawable.n_2); 
      break; 
     case 3: 
      btn.setBackgroundResource(R.drawable.n_3); 
      break; 
     case 4: 
      btn.setBackgroundResource(R.drawable.n_4); 
      break; 
     case 5: 
      btn.setBackgroundResource(R.drawable.n_5); 
      break; 
     case 6: 
      btn.setBackgroundResource(R.drawable.n_6); 
      break; 
     case 7: 
      btn.setBackgroundResource(R.drawable.n_7); 
      break; 
     case 8: 
      btn.setBackgroundResource(R.drawable.n_8); 
      break; 
     case 9: 
      btn.setBackgroundResource(R.drawable.n_9); 
      break; 
     default: 
      btn.setBackgroundResource(R.drawable.n_0); 
    } 
    adapter.checkHit(value); 
} 

}

これは、単純なcheckHit()である:

public void checkHit(int value){ 
    if(firstHit == true){ 
     previousValue = value; 
     firstHit = false; 
    } else if(value == previousValue){ 
     Toast.makeText(c, "You hit a pair!", Toast.LENGTH_SHORT).show(); 
    } else { 
     Toast.makeText(c, "This is not a pair!", Toast.LENGTH_SHORT).show(); 
    } 
} 

そしてこのすべてが動作します。 私の問題は、ユーザーが数字のペアを見つけたかどうかを確認した後、開始イメージとペアになっていないすべてのボタンを「閉じる」必要があるということです。これを行うために、私はcheckHit()を次のように変更しようとしました:

public void checkHit(int value){ 
    if(firstHit == true){ 
     previousValue = value; 
     firstHit = false; 
    } else if(value == previousValue){ 
     Toast.makeText(c, "You hit a pair!", Toast.LENGTH_SHORT).show(); 
     closeAllAvailableButtons(); 
    } else { 
     Toast.makeText(c, "This is not a pair!", Toast.LENGTH_SHORT).show(); 
     closeAllAvailableButtons(); 
    } 
} 

これは機能しません。リスナーの冒頭陳述

btn.setBackgroundResource(R.drawable.n_1); 

がadapter.checkHit(値)が実行された後にのみ実行されるためです。言い換えれば、ボタンの値に対応するイメージのクリックと割り当ての間に、プログラムがリフレッシュします。 結果はクリックで、クリック音ですがボタンイメージは変化しません。 私の問題は、ボタンをクリックした後にゲームの流れに戻る方法がわからないことだと思います。 私はインテントを使うことができたと思っていますが、ImageButtonAdapterはアクティビティではありませんので、私が理解しているところでインテントで呼び出すことはできません。 誰でも助けてくれますか? あらかじめ忍耐していただきありがとうございます。

答えて

0

この質問はむしろ主観的なので、私はあなたに状態を混乱させないようにCustomViewsを作成するようアドバイスします。だから、あなたはちょうどこのような何かを呼び出します、あなたはそれらのすべてが、2つのライブ「開かれた」をクローズする必要がある場合に、カスタムImageViewののウィッヒは、その後、いくつかの追加フィールドが含まれ、かつます作成することができます。

for (int i=0; i<parent.getChildCount(); i++ { 
    imageView = (CustomImageView) parent.getChildAt(i); 
    if //your customImageView not one of pair 
     imageView.customMethodClose(); //may be even with some animations 
    else { 
     imageView.customMethodToHighLighYouPair(); 
    } 
} 

これは5月の方法ですそれをするために。このようにして、状態を考慮して多くのバグを避けることができます。

関連する問題