Правильная передача списка массивов и присвоение оценки каждому элементу списка массивов

#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 :

  1. В Game , String[] names = bundle.getStringArray("arrayKey"); должно быть

     ArrayList<String> names = bundle.getStringArrayList("arrayKey");`
      
  2. В 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]);
}