#java #android #arrays #button
#java #Android #массивы #кнопка
Вопрос:
Спасибо всем, кто помог мне с другими моими вопросами. У меня почти получилось, но две последние проблемы мешают ему работать так, как я хочу.
Предполагается, что эти 2 класса выполняют следующие действия. 1-й класс получает имена людей, которые хотят поиграть в игру. Использует один и тот же EditText, и когда они вводят свое имя, они нажимают отправить. Когда все имена отправлены, они нажимают кнопку готово / воспроизведение, которая отправляет их и их данные (количество игроков и имена) в следующий класс. В классе 1 я считаю, что ошибка заключается в кнопке отправки. Я пытаюсь добавить все имена в список массивов, и я не верю, что это делается правильно. Когда я запускаю приложение, оно отлично принимает имена с точки зрения пользователей. Но на следующем экране должно отображаться их имя: (указано значение null, поэтому имена получены неправильно) и задача, которую нужно выполнить (которую он выполняет правильно).
Последнее, что ему нужно сделать, это в классе 2 разрешить нажимать на эти кнопки (сбой, champ и неплохо) только один раз (затем он присваивает оценку имени человека, чья очередь была), а затем ему нужно запустить следующего пользователя и задачу. (Это не делает ни того, ни другого atm). Я был бы очень признателен за помощь в запуске этой проклятой штуки. Спасибо всем, кто нашел время ответить. И извините, если вам надоело видеть мои запросы о помощи.
Класс 1
public class Class1 extends Activity
{
int players=0, i=0;
String names[];
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.class1);
final EditText input = (EditText) findViewById(R.id.nameinput);
final ArrayList<String> names = new ArrayList<String>();
//names = new String[players];
Button submitButton = (Button) findViewById(R.id.submit_btn);
submitButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View submit1)
{
//for( i=i; i < players; i )
//{
players ;
names.add(input.getText().toString());
//names[i] = input.getText().toString();
input.setText("");
//}
}
});
Button doneButton = (Button) findViewById(R.id.done_btn);
doneButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View done1)
{
Intent done = new Intent(Class1.this, Game.class);
Bundle bundle = new Bundle();
bundle.putStringArrayList("arrayKey", names);
done.putExtra("players", players);
//done.putExtra("names", names[players]);
startActivity(done);
}
});
}
Класс игры
public class Game extends Activity
{
int players, counter=0, score, ptasks,rindex;
String[] names;
String[] tasks;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.game);
Bundle bundle = this.getIntent().getExtras();
String[] names = bundle.getStringArray("arrayKey");
Intent game = getIntent();
players = game.getIntExtra("players", 1);
//names = game.getStringArrayExtra("names");
Random generator = new Random();
tasks = new String[10];
tasks[0]= "";
tasks[1]= "";
tasks[2]= "";
tasks[3]= "";
tasks[4]= "";
tasks[5]= "";
tasks[6]= "";
tasks[7]= "";
tasks[8]= "";
tasks[9]= "";
names = new String[players];
while (counter <5)
{
for (int i = 0; i < players; i )
{
TextView name1 = (TextView) findViewById(R.id.pname);
name1.setText( names[i] ":");
ptasks = 10;
rindex = generator.nextInt(ptasks);
TextView task = (TextView) findViewById(R.id.task);
task.setText( tasks[rindex]);
Button failButton = (Button) findViewById(R.id.fail_btn);
failButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View failed)
{
return;
}
});
Button notButton = (Button) findViewById(R.id.notbad_btn);
notButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View notbad)
{
return;
}
});
Button champButton = (Button) findViewById(R.id.champ_btn);
champButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View champp)
{
return;
}
});
}
counter ;
}
}
}
В качестве дополнительного примечания. То, что вы видите в тех разделах, рядом с которыми есть // comments, у меня есть, потому что я тестировал между ними и теми, которые не были закомментированы, и ни то, ни другое не сработало. Если у вас есть какие-либо предложения по исправлению чего-либо из этого, я ценю это.
Комментарии:
1. Вам также следует вернуться к своим предыдущим вопросам и выбрать ответы, где это уместно, и проголосовать за пользователей, чьи ответы были полезными. Это простой жест и элементарная вежливость, которые заставят людей продолжать помогать вам 🙂
Ответ №1:
Я вижу две проблемы с вашим кодом, которые могут объяснить, почему вы получаете null
для своего списка игроков во втором Activity
:
-
В
Game
,String[] names = bundle.getStringArray("arrayKey");
должно бытьArrayList<String> names = bundle.getStringArrayList("arrayKey");`
-
В
Class1
вы помещаетеArrayList
вBundle
(bundle.putStringArrayList("arrayKey", names);
), что бессмысленно, посколькуbundle
никуда не ведет. Вместо этого вы должны поместить его вIntent
:done.putStringListExtra("arrayKey", names);
Обратите внимание, что ваш код еще более запутан, потому что у вас есть и String []
named names
, и ArrayList
named names
в разных областях. Выберите один (я бы рекомендовал List
) и избавьтесь от другого.
Кроме того, в Game
этом нет необходимости:
Bundle bundle = this.getIntent().getExtras();
String[] names = bundle.getStringArray("arrayKey");
Intent game = getIntent();
players = game.getIntExtra("players", 1);
У вас уже есть bundle
непосредственно перед этим, так что вы могли бы также сделать:
Bundle bundle = this.getIntent().getExtras();
String[] names = bundle.getStringArray("arrayKey");
players = bundle.getInt("players", 1);
Основная концепция заключается в том, что при выполнении действия вызова вы помещаете информацию в Intent
, используя различные putExtra()
и putExtraXXX()
методы. В вызванном действии вы получаете информацию, которую вы поместили в Intent
, либо
- получение
Bundle
* от *Intent
черезgetExtras()
, а затем ввод всего, используя различныеget()
методы наBundle
(не наIntent
). - прямой вызов
getExtraXXX()
методов наIntent
.
Что касается второй части, в том виде, в каком ваш код на данный момент существует, он просто будет перебирать всех игроков сразу (всего 5 раз, я не понимаю цели counter
).
Вместо этого вам следует выполнять всю вашу обработку (вычисление оценки для текущего игрока, увеличение значения индекса игрока, установка следующей задачи и т.д.) Только при нажатии одной из 3 кнопок. Если это будет длительная задача, вы могли бы отключить кнопки до завершения, чтобы обеспечить выполнение требования о разрешении нажатия только одной кнопки на игрока. Повторно включите кнопки, когда будет готов следующий проигрыватель.
У меня нет энергии, чтобы подготовить все, что вам нужно, но для начала включите это:
public void onCreate(Bundle savedInstanceState)
{
//...other code here
while (counter <5)
{
for (int i = 0; i < players; i )
{
TextView name1 = (TextView) findViewById(R.id.pname);
name1.setText( names[i] ":");
ptasks = 10;
rindex = generator.nextInt(ptasks);
TextView task = (TextView) findViewById(R.id.task);
task.setText( tasks[rindex]);
Button failButton = (Button) findViewById(R.id.fail_btn);
failButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View failed)
{
return;
}
});
Button notButton = (Button) findViewById(R.id.notbad_btn);
notButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View notbad)
{
return;
}
});
Button champButton = (Button) findViewById(R.id.champ_btn);
champButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View champp)
{
return;
}
});
}
counter ;
}
//...other code here
}
в
public void onCreate(Bundle savedInstanceState)
{
//...other code here
int i = 0;
TextView name1 = (TextView) findViewById(R.id.pname);
TextView task = (TextView) findViewById(R.id.task);
Button failButton = (Button) findViewById(R.id.fail_btn);
failButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View failed)
{
//do what must be done for the current player, calculate score, etc
prepareNextPlayer( i, names, name1, task);
}
});
Button notButton = (Button) findViewById(R.id.notbad_btn);
notButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View notbad)
{
//do what must be done for the current player, calculate score, etc
prepareNextPlayer( i, names, name1, task);
}
});
Button champButton = (Button) findViewById(R.id.champ_btn);
champButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View champp)
{
//do what must be done for the current player, calculate score, etc
prepareNextPlayer( i, names, name1, task);
}
});
//...other code here
}
private void prepareNextPlayer(int i, ArrayList<String> names, String [] tasks, TextView nameField, TextView taskField)
{
if(i >= names.size())
{
//all players have been processed, what happens now?
return;
}
int rindex = generator.nextInt(10);
nameField.setText( names.get(i) ":");
task.setText( tasks[rindex]);
}