Предполагается, что эта игра должна соответствовать количеству каждой кнопки. Будет 12 различных номеров, и номера будут установлены на случайную кнопку (2 кнопки будут иметь одинаковые номера). Игрок должен нажать первую кнопку, цвет кнопки изменится на красный, и если игрок снова нажмет на другую кнопку, он проверит, есть ли у нее такой же номер или нет, если да, то обе кнопки останутся красными. Для кнопок я использую сетку кнопок. Я установил все кнопки на черный цвет, и если я нажму на кнопку, она изменит свой цвет на красный. Кнопки отображаются правильно, и все кнопки работают отлично, за исключением первой кнопки (в верхнем левом углу), она не становится красной, но все равно проверяет, имеет ли она тот же номер или нет.
Мой код для getView на BaseAdapter:
gridView.setAdapter(new BaseAdapter() {
@Override
public int getCount() {
return buttons.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
if (convertView==null) buttons[position] = new Button(activity3.this);
else buttons[position] = (Button)convertView;
if (position==12) Collections.shuffle(numbers);
buttons[position].setText(String.valueOf(numbers.get(position%12)));
buttons[position].setTextSize(0);
buttons[position].setBackgroundColor(Color.BLACK);
buttons[position].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onClick && position!=indexClick) {
onClick = false;
String _strClicked = buttons[indexClick].getText().toString();
String _strNow = buttons[position].getText().toString();
if (_strClicked.equals(_strNow)) {
countSuccess++;
buttons[indexClick].setEnabled(false);
buttons[position].setEnabled(false);
buttons[position].setBackgroundColor(Color.RED);
buttons[position].setTextSize(15);
}else {
countFail++;
buttons[indexClick].setBackgroundColor(Color.BLACK);
}
if (countSuccess==11){
Intent intent = new Intent(activity3.this, activity2.class);
intent.putExtra("countFail", String.valueOf(countFail));
startActivity(intent);
finish();
}
} else {
buttons[position].setBackgroundColor(Color.RED);
indexClick = position;
onClick = true;
buttons[position].setTextSize(15);
}
}
});
return buttons[position];
}
});
Для XML:
<?xml version = "1.0" encoding = "utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
tools:context = ".activity3"
android:id = "@+id/act3_ConstraintLayout"
>
<GridView
android:id = "@+id/gridview"
android:layout_width = "0dp"
android:layout_height = "wrap_content"
android:layout_margin = "5dp"
android:layout_marginStart = "8dp"
android:layout_marginTop = "8dp"
android:layout_marginEnd = "8dp"
android:gravity = "center"
android:horizontalSpacing = "10dp"
android:numColumns = "auto_fit"
android:stretchMode = "columnWidth"
android:verticalSpacing = "10dp"
app:layout_constraintEnd_toEndOf = "parent"
app:layout_constraintStart_toStartOf = "parent"
app:layout_constraintTop_toTopOf = "parent" />
<TextView
android:id = "@+id/act3_textViewNICKNAME"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_marginStart = "24dp"
app:layout_constraintBottom_toTopOf = "@+id/button"
app:layout_constraintStart_toStartOf = "parent" />
<TextView
android:id = "@+id/act3_textViewNilaiMin"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_marginEnd = "32dp"
android:layout_marginBottom = "4dp"
app:layout_constraintBottom_toTopOf = "@+id/button"
app:layout_constraintEnd_toEndOf = "parent" />
<Button
android:id = "@+id/button"
android:layout_width = "0dp"
android:layout_height = "wrap_content"
android:layout_marginStart = "8dp"
android:layout_marginEnd = "8dp"
android:text = "HOME 26416058"
app:layout_constraintBottom_toBottomOf = "parent"
app:layout_constraintEnd_toEndOf = "parent"
app:layout_constraintHorizontal_bias = "1.0"
app:layout_constraintStart_toStartOf = "parent" />
</android.support.constraint.ConstraintLayout>
Я попытался использовать android: ПотомкуFocusability = "blocksDescendants" в макете ограничений, но первая кнопка в верхнем левом углу не становится красной, когда я нажимаю на нее.
Я просмотрел несколько ссылок, но он все еще не работает: Первая кнопка Android GridView не работаетOnClickListener не работает для первого элемента в GridView
@Lucefer, я действительно не понимаю, что вы имели в виду, он инициализирует onclickListener для первого щелчка. Я поместил метод setAdapter в onCreate. Первый щелчок по любому элементу приведет к тому, что кнопка изменит свой цвет на красный, просто не имеет значения, будет ли это первый щелчок или второй щелчок, любая кнопка рядом с первой кнопкой (верхний левый угол) изменит свой цвет фона на красный
где объявление и инициализация indexClick и onClick
@navylover логическое onClick = false и int indexClick = -1
@ Рики, кажется, все идеально. я хотел бы предложить тест. вызывать Toast при каждом щелчке, последовательно нажимая кнопки и проверять, какой индексный тост отображается?
@SyedHamzaHassan, я сделал это, когда я нажимаю первую кнопку, он показывает, что позиция равна 0 (правильно), но цвет фона все равно не меняется на красный
пожалуйста, обратите внимание на эту строку:
if (position==12) Collections.shuffle(numbers);
//if the length of buttons array is 12,the max index is 11, not 12.
//position==12 always equals to false.
Спасибо за ответ, но он не имеет ничего общего с onclick, у меня положительный результат == 11
ваш метод getView (..) запускается во время инициализации? в противном случае он будет инициализировать onclickListener при первом нажатии. Тогда начни слушать второй раз