Salut,
Je ne sais pas trop si ton problème est toujours d'actu mais voici une solution 'assez simpliste':
Le fichier layout activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="16dp"
tools:context="xx.yyy.foo.MainActivity">
<TextView
android:id="@+id/textview"
android:layout_alignParentTop="true"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ToggleButton
android:id="@+id/button1"
android:layout_below="@id/textview"
android:layout_alignParentStart="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"/>
<ToggleButton
android:id="@+id/button2"
android:layout_below="@id/textview"
android:layout_toEndOf="@id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"/>
<ToggleButton
android:id="@+id/button3"
android:layout_below="@id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick" />
<ToggleButton
android:id="@+id/button4"
android:layout_below="@id/button2"
android:layout_toEndOf="@id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"/>
</RelativeLayout>
Le code de l'activity MainActivity.java:
package xx.yyy.foo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.CycleInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private List<Integer> mList = null; /* Liste utilisée pour l'ordre */
private List<ToggleButton> mListButtons = null; /* Temporaire pour faciliter la manipulation des boutons */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mList = new ArrayList<>();
mListButtons = new ArrayList<>(Arrays.asList(
findViewById(R.id.button1),
findViewById(R.id.button2),
findViewById(R.id.button3),
findViewById(R.id.button4)
));
/* Init des textes des boutons */
final Locale locale = Locale.US;
for(int i = 0; i < mListButtons.size(); i++) {
ToggleButton tb = mListButtons.get(i);
tb.setTextOn(String.format(locale, "On: Button %d", i));
tb.setTextOff(String.format(locale, "Off: Button %d", i));
}
/* Build de la liste du "jeu" */
buildList();
}
/**
* Construction de la liste utilisée pour le "jeu"
*/
private void buildList() {
if(!mList.isEmpty()) /* cas d'erreur */
mList.clear();
/* Re remplissage de la liste */
for(int i = 0; i < mListButtons.size(); i++)
mList.add(i);
/* random de la liste */
Collections.shuffle(mList);
/* Affichage de l'ordre */
StringBuilder sb = new StringBuilder();
sb.append("List order: ");
mList.forEach((i) -> sb.append(i).append(" "));
((TextView)findViewById(R.id.textview)).setText(sb.toString().trim());
/* Revalidation des boutons */
uncheckAll();
}
/**
* Click sur un bouton.
* @param v Vue du click.
*/
public void onClick(View v) {
ToggleButton tb = (ToggleButton)v;
String lbl = tb.getText().toString();
/* Récupération de l'index (récupéré dans le label) */
int idx = Integer.parseInt(lbl.substring(lbl.lastIndexOf(' ') + 1, lbl.length()));
/* Validation de l'ordre */
if(mList.get(0) == idx) {
v.setEnabled(false); /* désactivation du bouton */
mList.remove(0); /* suppression dans la liste */
if(mList.isEmpty()) {
Toast.makeText(this, "Success :)", Toast.LENGTH_SHORT).show();
buildList();
}
} else {
Toast.makeText(this, "Error :(", Toast.LENGTH_SHORT).show();
shake((ToggleButton)v);
buildList();
}
}
/**
* Petite animation en cas d'erreur.
* @param tb Bouton à animer.
*/
private void shake(ToggleButton tb) {
TranslateAnimation shake = new TranslateAnimation(0, 10, 0, 0);
shake.setDuration(500);
shake.setInterpolator(new CycleInterpolator(5));
tb.clearAnimation();
tb.startAnimation(shake);
}
/**
* Deselectionne et reactive les boutons.
*/
private void uncheckAll() {
mListButtons.forEach((bt) -> {
bt.setChecked(false);
bt.setEnabled(true);
});
}
}
Dans le code j'utilise la syntaxe java 1.8 il faudra donc ajouter le bloc compileOptions dans le fichier build.gradle (chez moi c'est dans celui de l'application):
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "xx.yyy.foo"
minSdkVersion 24
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}