Я вижу две проблемы с вашим кодом, которые могут объяснить, почему вы получаете 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 []
с именем names
иArrayList
назван 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
* от * the Intent
через getExtras()
, а затем вводить все, используя различные методы get()
для Bundle
( not * 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]);
}