2012-10-17 62 views
3

更新)抱歉如果這是越來越像的指南。有沒有其他網站我應該發佈這個?創建使用「for循環」按鈕的陣列,並且使用內的值來改變一個bool陣列值

我正在做一個擲骰子的遊戲,我對我的方式學習循環。我的方法是類似的頂端回答的這樣一個問題: dynamic button onclick event inside for loop 這裏是我的代碼:(是的,我混合語言,我很抱歉)

package se.balderskolan.yatzy; 

    import java.util.Random; 
    import android.os.Bundle; 
    import android.app.Activity; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.ImageButton; 

    public class MainActivity extends Activity { 

Button btKasta; 
Random r = new Random(); 
int[] tarningar = new int[5]; 
int[] bilder = new int [6]; 
ImageButton [] img= new ImageButton[5]; 
boolean [] bool = new boolean[5]; 

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

    btKasta = (Button)findViewById(R.id.btKasta); 

    bilder [0]=R.drawable.b1; //Pictures of the dices 
    bilder [1]=R.drawable.b2; 
    bilder [2]=R.drawable.b3; 
    bilder [3]=R.drawable.b4; 
    bilder [4]=R.drawable.b5; 
    bilder [5]=R.drawable.b6; 

    img [0] = (ImageButton)findViewById(R.id.imgbt1); //The grafical dices 
    img [1] = (ImageButton)findViewById(R.id.imgbt2); 
    img [2] = (ImageButton)findViewById(R.id.imgbt3); 
    img [3] = (ImageButton)findViewById(R.id.imgbt4); 
    img [4] = (ImageButton)findViewById(R.id.imgbt5); 


    //The die-buttons (save or not) 
    img [0].setOnClickListener(
      new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        if(bool [0] == false) { 
         bool [0] = true; 
        } 

        else{ 
         bool [0] = false; 
        } 
       } 
      } 
      ); 

    img [1].setOnClickListener(
      new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        if(bool [1] == false) { 
         bool [1] = true; 
        } 

        else{ 
         bool [1] = false; 
        } 
       } 
      } 
      ); 

    img [2].setOnClickListener(
      new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        if(bool [2] == false) { 
         bool [2] = true; 
        } 

        else{ 
         bool [2] = false; 
        } 
       } 
      } 
      ); 

    img [3].setOnClickListener(
      new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        if(bool [3] == false) { 
         bool [3] = true; 
        } 

        else{ 
         bool [3] = false; 
        } 
       } 
      } 
      ); 

    img [4].setOnClickListener(
      new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        if(bool [4] == false) { 
         bool [4] = true; 
        } 

        else{ 
         bool [4] = false; 
        } 
       } 
      } 
      ); 

    /*I want to replace the code above with something like this below 

    for(imgbt=0; imgbt<5; imgbt++){ 
     img [imgbt].setOnClickListener(
       new View.OnClickListener() { 

        @Override 
        public void onClick(View v) { 

         if(bool [imgbt] == false) { 
          bool [imgbt] = true; 
         } 
         else{ 
          bool [imgbt] = false; 
         } 

        } 
       } 
     ); 

    } 
    */ 

    //The die-throwing button 
    btKasta.setOnClickListener(    
     new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

        for(int i=0; i<5; i++){ 
         tarningar [i]=r.nextInt(6); 

         if (bool[i]==false){ 
          img [i].setImageResource(bilder [tarningar[i]]);} 
         else{} 
        }     
       } 
      } 
    ); 
} 

    } 

(我可以補充一點,我已經成功地有bottons保存使用的代碼骰子沒有for循環)

在我的代碼做一些研究後,我發現了以下有關的按鈕,用於循環:

  • 「imgbt」的值是5在行

    if(bool [imgbt] == false) 
    

    這給了我「ArrayIndexOutOfBoundsException」 - 錯誤。

  • 所有總是的按鈕中的改變布爾的布爾值[5](其中不存在。我發現這通過增加聲明創建了陣列的nuber)

如果我宣佈

int imgbt = 0 

裏面的for循環日食給我的錯誤:

Cannot refer to a non-final variable imgbt inside an inner class defined in a different method 

(有人能解釋這個問題?)

所以,你知道任何解決我的問題,或者另一種方式來解決它,請不要猶豫,awnser!

回答

1

所以你真正的問題是,你定義一個覆蓋在使用一個可變的,非最終,變量在一個班級。因此,如果您將代碼修改爲看起來像下面的樣子:

for(imgbt=0; imgbt<5; imgbt++){ 
    public final someInteger = imgbt; 
    img [imgbt].setOnClickListener(
      new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if(bool [someInteger] == false) { 
         bool [someInteger] = true; 
        } 
        else{ 
         bool [someInteger] = false; 
        } 
       } 
     } 
    ); 
} 

它應該可以很好地工作。

0

您需要實例化數組,像這樣:

Boolean bool[] = new Boolean[]{false, false, false, false, false, false, false}; 
2

這並不真的有很多工作要做,與Android,這是基本的Java。簡而言之:

  • 陣列從索引開始0
  • 對象陣列(如Boolean)是默認與null小號
  • 初始化你需要使兩個陣列相同的大小

所以,

  • 從0
  • 啓動循環10
  • 使用booolean[]代替Boolean[]或use`
  • 之前Boolean.FALSE初始化它使兩個數組大小6
+0

感謝您的幫助!我從中學到了一點。儘管我的問題還沒有解決。 – Epcilon

+0

這就像教程一樣,所以SO可能不是最好的地方。花更多的時間用Java書,學習如何使用調試器來查看問題出在哪裏。也許顯示你的所有代碼,所以人們不必猜測。順便說一句,爲數組寫'for'循環的規範方法是:for(int i = 0; i

+0

我不確定我能理解你應該怎麼寫'for'循環。 – Epcilon