0

I make a game like 4Pics1Word.

Now I have 14 buttons and I want to set the visibility of the Buttons in a loop.

If the answer has 5 letters, the first 5 Buttons should be Visible

For example this is my code:

int lengthTest = dataArr.get(currentQuestion)[0].length(); // Get Length of the word from the array.
        for (int nr = 0; nr <= lengthTest; nr++) { // My Loop doesnt work
            answer[nr].setVisibility(View.VISIBLE);
        }

And that is what I have now, but for 100 Pics it take´s to long to write it every time

        answer1.setVisibility(View.VISIBLE); //Button1 Visible because the answer length (lengthTest) is 5
        answer2.setVisibility(View.VISIBLE); //Button2 Visible
        answer3.setVisibility(View.VISIBLE); //Button3 Visible
        answer4.setVisibility(View.VISIBLE); //Button4 Visible
        answer5.setVisibility(View.VISIBLE); //Button5 Visible
        answer6.setVisibility(View.GONE); //Button6 GONE
        answer7.setVisibility(View.GONE);
        answer8.setVisibility(View.GONE);
        answer9.setVisibility(View.GONE);
        answer10.setVisibility(View.GONE);
        answer11.setVisibility(View.GONE);

I hope you understand it sorry for my bad english

Thank you

I got it work, with a Button[] If you want I post the code later.

Thank you all for your help


Now I tried this:

int lengthTest = dataArr.get(currentQuestion)[0].length() - 1;
        for (int i=1; i<15; i++){
              int buttonId = this.getResources().getIdentifier("answer"+i, "string", this.getPackageName());
              Button currentGameButton = (Button)findViewById(buttonId);
              //now you can do whatever you need for this button, for example
              currentGameButton.setVisibility(View.VISIBLE);
              // implement checkButtonVisibility to determine whether this button should be VISIBLE or GONE
            }

I got this error:

02-26 16:08:41.429: E/AndroidRuntime(31838): FATAL EXCEPTION: main

02-26 16:08:41.429: E/AndroidRuntime(31838): Process: com.developer.flagsofnations, PID: 31838 02-26 16:08:41.429: E/AndroidRuntime(31838): java.lang.NullPointerException 02-26 16:08:41.429: E/AndroidRuntime(31838): at com.developer.flagsofnations.FlagsOfNations.showQuestion(FlagsOfNations.java:673) 02-26 16:08:41.429: E/AndroidRuntime(31838): at com.developer.flagsofnations.FlagsOfNations$1.onClick(FlagsOfNations.java:196) 02-26 16:08:41.429: E/AndroidRuntime(31838): at android.view.View.performClick(View.java:4480) 02-26 16:08:41.429: E/AndroidRuntime(31838): at android.view.View$PerformClick.run(View.java:18686) 02-26 16:08:41.429: E/AndroidRuntime(31838): at android.os.Handler.handleCallback(Handler.java:733) 02-26 16:08:41.429: E/AndroidRuntime(31838): at android.os.Handler.dispatchMessage(Handler.java:95) 02-26 16:08:41.429: E/AndroidRuntime(31838): at android.os.Looper.loop(Looper.java:157) 02-26 16:08:41.429: E/AndroidRuntime(31838): at android.app.ActivityThread.main(ActivityThread.java:5872) 02-26 16:08:41.429: E/AndroidRuntime(31838): at java.lang.reflect.Method.invokeNative(Native Method) 02-26 16:08:41.429: E/AndroidRuntime(31838): at java.lang.reflect.Method.invoke(Method.java:515) 02-26 16:08:41.429: E/AndroidRuntime(31838): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:852) 02-26 16:08:41.429: E/AndroidRuntime(31838): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:668) 02-26 16:08:41.429: E/AndroidRuntime(31838): at dalvik.system.NativeStart.main(Native Method)

If I use the debugger I can see that buttonId = 0 and currentGameButton = null

I think the problem is here: Line 673 is currentGameButton.setVisibility(View.VISIBLE); because this is 0

Brad Larson
  • 170,088
  • 45
  • 397
  • 571
Nic
  • 1
  • 3

2 Answers2

0

If you don't want to dynamically create the buttons, then it looks like you should be using a ternary operator.

int lengthTest = dataArr.get(currentQuestion)[0].length();
for (int nr = 0; nr < answer.length; nr++) {
    answer[nr].setVisibility((nr < lengthTest)?View.VISIBLE:View.GONE);
}
tachyonflux
  • 20,103
  • 7
  • 48
  • 67
  • Hi if I try your solution, I got the error: answer cannot be resolved to a variable I think because the button id is answer1 and not only answer. That I try and it doesn´t work because this I ask here. – Nic Feb 26 '15 at 14:57
  • It's a modification of the first code block you posted. I was assuming that `answer` is suppose to be an array of your buttons. What was your purpose in posting that code block? – tachyonflux Feb 26 '15 at 15:46
0

Updated on 16/3/15 (should work now):

Use the Id field of your buttons in order to dynamically change the setting of them from the code. Set the button's IDs using some kind of convention (based on this solution).

Meaning, for example, the buttons should be declared in your layout.xml as following:

<RelativeLayout...>
  <Button
     android:id="@+id/gameButton1"
     ... />
  <Button
     android:id="@+id/gameButton2"
     ... />
  ...
  <Button
     android:id="@+id/gameButton14"
     ... />
</RelativeLayout>

And then your java code that control your buttons can be something like:

for (int i=1; i<15; i++){
  int buttonId = this.getResources().getIdentifier("gameButton"+i, "id", this.getPackageName());
  Button currentGameButton = (Button)findViewById(buttonId);
  //now you can do whatever you need for this button, for example
  currentGameButton.setVisibility(checkButtonVisibility(i));
  // implement checkButtonVisibility to determine whether this button should be VISIBLE or GONE
}

Let me know if this helps or you have additional questions

Community
  • 1
  • 1
GyRo
  • 2,586
  • 5
  • 30
  • 38
  • Hi sorry for my late answer I had school until now. If I try your solution, I get the following error: FATAL EXCEPTION: main java.lang.NullPointerException – Nic Feb 26 '15 at 14:53
  • @Nic I fixed it. (getIdentifiier should have used 'id') It should throw NPE now. – GyRo Mar 16 '15 at 10:56