2016-07-24 54 views
-1

我有一些Java代碼,我想作爲一個多選瑣事風格的遊戲。隨機顏色字符串顯示在TextView中,當正確的對應顏色按鈕被按下時,TextView中的隨機字符串被更新。但是,這隻能工作一次。在啓動活動時,唯一可以更改TextView字符串的顏色按鈕是與TextView中的當前字符串對應的顏色按鈕。但是,在此之後,函數似乎「鎖定」並且第一個字符串的相應顏色按鈕是唯一可以使TextView字符串更改的按鈕。有沒有辦法重置onClick事件或讓他們循環?非常感謝!!!!如何讓onClick事件重複

public class MainActivity extends AppCompatActivity { 

private static final Random r_generator = new Random(); 
String textViewString; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Resources res = getResources(); 
    TextView tv = (TextView) findViewById(R.id.color_text); 
    String[] myString = res.getStringArray(R.array.colorArray); 
    String q = myString[r_generator.nextInt(myString.length)]; 
    tv.setText(q); 
    textViewString = tv.getText().toString(); 


    Button green= (Button) findViewById(R.id.green_button); 
    green.setOnClickListener(new View.OnClickListener() { 
     @Override public void onClick(View v) { 
      if (!textViewString.equals("Green")) return; 
      Resources res = getResources(); 
      String[] myString = res.getStringArray(R.array.colorArray); 
      String q = myString[r_generator.nextInt(myString.length)]; 
      TextView tv = (TextView) findViewById(R.id.color_text); 
      tv.setText(q); 
     } 
    }); 

    Button blue = (Button) findViewById(R.id.blue_button); 
    blue.setOnClickListener(new View.OnClickListener() { 
     @Override public void onClick(View v) { 
      if (!textViewString.equals("Blue")) return; 
      Resources res = getResources(); 
      String[] myString = res.getStringArray(R.array.colorArray); 
      String q = myString[r_generator.nextInt(myString.length)]; 
      TextView tv = (TextView) findViewById(R.id.color_text); 
      tv.setText(q); 
     } 
    }); 

    Button red = (Button) findViewById(R.id.red_button); 
    red.setOnClickListener(new View.OnClickListener() { 
     @Override public void onClick(View v) { 
      if (!textViewString.equals("Red")) return; 
      Resources res = getResources(); 
      String[] myString = res.getStringArray(R.array.colorArray); 
      String q = myString[r_generator.nextInt(myString.length)]; 
      TextView tv = (TextView) findViewById(R.id.color_text); 
      tv.setText(q); 

    } 
}); 

    Button yellow = (Button) findViewById(R.id.yellow_button); 
    yellow.setOnClickListener(new View.OnClickListener() { 
     @Override public void onClick(View v) { 
      if (!textViewString.equals("Yellow")) return; 
      Resources res = getResources(); 
      String[] myString = res.getStringArray(R.array.colorArray); 
      String q = myString[r_generator.nextInt(myString.length)]; 
      TextView tv = (TextView) findViewById(R.id.color_text); 
      tv.setText(q); 

     } 
    }); 

    Button white = (Button) findViewById(R.id.white_button); 
    white.setOnClickListener(new View.OnClickListener() { 
     @Override public void onClick(View v) { 
      if (!textViewString.equals("White")) return; 
      Resources res = getResources(); 
      String[] myString = res.getStringArray(R.array.colorArray); 
      String q = myString[r_generator.nextInt(myString.length)]; 
      TextView tv = (TextView) findViewById(R.id.color_text); 
      tv.setText(q); 

     } 
    }); 

    Button orange = (Button) findViewById(R.id.orange_button); 
    orange.setOnClickListener(new View.OnClickListener() { 
     @Override public void onClick(View v) { 
      if (!textViewString.equals("Orange")) return; 
      Resources res = getResources(); 
      String[] myString = res.getStringArray(R.array.colorArray); 
      String q = myString[r_generator.nextInt(myString.length)]; 
      TextView tv = (TextView) findViewById(R.id.color_text); 
      tv.setText(q); 

     } 
    }); 

    Button brown = (Button) findViewById(R.id.brown_button); 
    brown.setOnClickListener(new View.OnClickListener() { 
     @Override public void onClick(View v) { 
      if (!textViewString.equals("Brown")) return; 
      Resources res = getResources(); 
      String[] myString = res.getStringArray(R.array.colorArray); 
      String q = myString[r_generator.nextInt(myString.length)]; 
      TextView tv = (TextView) findViewById(R.id.color_text); 
      tv.setText(q); 

     } 
    }); 

    Button pink = (Button) findViewById(R.id.pink_button); 
    pink.setOnClickListener(new View.OnClickListener() { 
     @Override public void onClick(View v) { 
      if (!textViewString.equals("Pink")) return; 
      Resources res = getResources(); 
      String[] myString = res.getStringArray(R.array.colorArray); 
      String q = myString[r_generator.nextInt(myString.length)]; 
      TextView tv = (TextView) findViewById(R.id.color_text); 
      tv.setText(q); 

     } 
    }); 

    Button purple = (Button) findViewById(R.id.purple_button); 
    purple.setOnClickListener(new View.OnClickListener() { 
     @Override public void onClick(View v) { 
      if (!textViewString.equals("Purple")) return; 
      Resources res = getResources(); 
      String[] myString = res.getStringArray(R.array.colorArray); 
      String q = myString[r_generator.nextInt(myString.length)]; 
      TextView tv = (TextView) findViewById(R.id.color_text); 
      tv.setText(q); 

     } 
    }); 



    } 
} 
+0

此外,你可以將你的onClickListener分解成一個可重用的內部類,它將縮小源代碼並使其更容易維護。想象一下,如果你有一千個按鈕! – usajnf

+0

@Franco請接受最適合您的答案。如果沒有回答問題是一種不好的做法,可能會讓用戶尋找同樣問題的良好答案。 –

回答

0

所以佛朗哥,有兩件事可以讓你的代碼更加簡潔並解決你的問題。首先,我建議將onClick()函數合併爲一個onClick()。首先你需要更新你的XML代碼。在每個按鈕添加下列行

android:onClick="onClick" 

這意味着,當按下時與此的onClick功能定義的每個按鈕將在onclick功能執行代碼。您的onClick函數應該看起來類似於以下內容。

public void onClick(View view){ 
    //This casts your view to be a button so you can access its features as a button 
    Button btn = (Button) view; 
    textViewString = tv.getText().toString(); 

    if(!btn.getText().toString().equals(textViewString)){ 
     //Perform action to notify user that they pressed the wrong button 
     //Do not return here. This is what caused your program to lock up 
     //Maybe add a TextView that says correct/incorrect and you can change that when the user is correct or incorrect 
    } 

    //Gets a random color from your string array and sets it to the TextView 
    q = myString[r_generator.nextInt(myString.length)]; 
    tv.setText(q); 
} 
+0

除了您必須將文本更改爲字符串之外,此答案適用於我。 'tv.getText()。的toString()' – Franco

0

你代碼非常多餘。如果您發現您有重複這部分遍佈

 Resources res = getResources(); 
     String[] myString = res.getStringArray(R.array.colorArray); 
     String q = myString[r_generator.nextInt(myString.length)]; 
     TextView tv = (TextView) findViewById(R.id.color_text); 
     tv.setText(q); 
     // here is what you forgot 
     textViewString = q; 

,你可以創建一個像復位()的方法,只是打電話給你的onClick這裏面()方法。

你能做的最好的辦法是隻作單法像

public void myButtonClickMethod(View v) 
{ 
    switch(v.getId()) 
    { 
     // check here witch button was pressed 
     case R.id.red_button: 
      // do the job here for red button 
      break; 
     case R.id.blue_button: 
      // do the job here for blue button 
      break; 
     .... 
     ..... 
    } 
    // after job done call your rest() method 
    reset(); 
} 
現在

在每個按鈕添加一個layout.xml查看參數onclick屬性

<Button 
    .... 
    .... 
    android:onClick="myButtonClickMethod" 

我希望這個幫助。