CheckBox [] с помощью onClickListener []? - PullRequest
3 голосов
/ 03 июня 2011

РЕДАКТИРОВАТЬ: этот вопрос в основном закрыт, и обсуждаются только те проблемы, которые у меня возникают с этим кодом здесь

Для части моего приложения у меня есть страницаэлементов, представленных в виде флажков, каждый со связанным логическим значением, которые в конечном итоге собираются и сохраняются в виде строки следующим образом:

final CheckBox gas_oil = (CheckBox) findViewById(R.id.gas_oil);
gas_oil.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
    {
    if (gas_oil.isChecked())
        {
        impacts.append(getString(R.string.gas_oil) + " | ");
        anythingchecked = true;
        }
    }
});

это чрезвычайно утомительно и, как представляется, не очень эффективный способ сделатьэто так, у меня есть 9 или 10 предметов, которые пользователи могут проверить или нет.также этот метод означает, что если они щелкают и не щелкают что-то, этот элемент все еще находится в StringBuilder impacts, и что если они щелкают его снова, то он там дважды.

Мое решение состояло в том, чтобы все было в массивах:

  String[] impactsn = getResources().getStringArray(R.array.impacts);
  final boolean[] impactsb = new boolean[impactsn.length];
  final CheckBox[] impactsc = new CheckBox[impactsn.length];
  View[] impactsv = new View[]{findViewById(R.id.gas_oil),findViewById(R.id.ghost_fishing),findViewById(R.id.marsh_damage),findViewById(R.id.nav_haz),findViewById(R.id.shell_damage),findViewById(R.id.waste_pollution),findViewById(R.id.wild_entang),findViewById(R.id.other)};

  for (int i = 0; i < impactsn.length; i++)
    {
    impactsc[i] = (CheckBox) impactsv[i];
    impactsc[i].setOnClickListener(new OnClickListener()
            {   
            @Override
            public void onClick(View v)
                {
                if (impactsc[i].isChecked())
                    impactsb[i] = true;
                else
                    impactsb[i] = false;
                }
            });
    }

к сожалению, выполнение этого вызывает проблему, заключающуюся в том, что (насколько я понимаю) вещи в OnClickListener должны быть окончательными.С таким кодом, как написано, i никогда не может быть окончательным, так что я в некотором роде остановился.

Должен ли я иметь массив OnClickListeners?Должен ли я вызывать метод вне кода, который у меня есть здесь?

Кроме того, ниже приведен получатель, который я планировал использовать, я думаю, что эта часть будет работать нормально:

String getImpacts ()
    {
            String[] impactsn = getResources().getStringArray(R.array.impacts);
    StringBuilder impactss = new StringBuilder();
    for (int i = 0; i < impactsn.length; i ++)
        {
        if (impactsb[i])
                    impactss.append(impactsn[i] + " | ");
        }
    return String.valueOf(impactss);
    }

РЕДАКТИРОВАТЬ: это версия кода, с которой я сейчас работаю:

package com.citsci.mardeb;

import android.app.Activity;импорт android.content.res.Resources;импорт android.os.Bundle;импорт android.view.View;import android.widget.CheckBox;import android.widget.EditText;

открытый класс Impacts extends реализует Activity реализует View.OnClickListener {int length = 7;логический []лецb = новый логический [] {ложь, ложь, ложь, ложь, ложь, ложь, ложь, ложь};EditText view;

public void onCreate (Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.impacts);

// for (int i = 0; i

  View[] impactsv = new View[]
     {
    findViewById(R.id.gas_oil),
        findViewById(R.id.ghost_fishing),
        findViewById(R.id.marsh_damage),
        findViewById(R.id.nav_haz),
        findViewById(R.id.shell_damage),
        findViewById(R.id.waste_pollution),
        findViewById(R.id.wild_entang),
        findViewById(R.id.other)
        };

  CheckBox[] impactsc = new CheckBox[length];

  for (int i = 0; i < length; i++)
     {
     impactsc[i] = (CheckBox) impactsv[i];
     impactsc[i].setOnClickListener(this);
     }

}// end of onCreate

@Override
public void onClick(View v)
    {
  switch (v.getId()) {
     case (R.id.gas_oil):
        impactsb[0] =! impactsb[0];
        break;
     case (R.id.ghost_fishing):
        impactsb[1] =! impactsb[1];
        break;
     case (R.id.marsh_damage):
        impactsb[2] =! impactsb[2];
        break;
     case (R.id.nav_haz):
        impactsb[3] =! impactsb[3];
        break;
     case (R.id.shell_damage):
        impactsb[4] =! impactsb[4];
        break;
     case (R.id.waste_pollution):
        impactsb[5] =! impactsb[5];
        break;
     case (R.id.wild_entang):
        impactsb[6] =! impactsb[6];
        break;
     case (R.id.other):
        impactsb[7] =! impactsb[7];
        }
    }

String getImpacts ()
    {
    String[] impactsn = new String[length];
    Resources myResources = getResources();
    impactsn = myResources.getStringArray(R.array.impacts);
  StringBuilder impactss = new StringBuilder();
    for (int i = 0; i < length; i ++)
        {
        if (impactsb[i])
            impactss.append(impactsn[i] + " | ");
        }
    if (String.valueOf(impactss) != "")
        impactss.insert(0, "Impacts: ");
    return String.valueOf(impactss);
    }
}// end of Impacts.class

Ответы [ 3 ]

3 голосов
/ 03 июня 2011

В этом случае не используйте анонимных (встроенных) слушателей. Вместо этого пусть ваш Activity реализует слушателя ...

public class MyActivity extends Activity
    implements View.OnClickListener {

    ...

    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case impactsv[0].getId:
                impactsb[0] = !impactsb[0];
                ...
                break;

            // Add other cases here

        }

    }
}

Тогда все, что вам нужно сделать, чтобы установить слушателя, это ...

impactsc[i].setOnClickListener(this);

Затем проверьте, для чего был выбран CheckBox, с помощью View, который передается ...

onClick(View v)

1 голос
/ 05 июня 2011

Здесь вы найдете полный код для этого, просто заполните между вашими потребностями:

открытый класс mainA extends Activity {CheckBox [] chbx; кнопка apply;

public void OnCreate(Bundle bundle)
{   super.onCreate(bundle);
    setMyChBx();apply=new Button(this);
    apply.setOnClickListener(new View.OnClickListener()
{   public void onClick(View v)
    {   if(chbx[0].isSelected()) setsomthing0();
        if(chbx[1].isSelected()) setsomthing1();
        if(chbx[2].isSelected()) setsomthing2();
        if(chbx[3].isSelected()) setsomthing3(); // and so on
    }
});
}

public void setMyChBx()
{   chbx=new CheckBox[25];
    for(int i=0;i<25;i++)
    {   chbx[i]=new CheckBox(this);
        chbx[i].setTag(new Integer(i));//tags for the checkboxes simply from 0 to 24 (24 included)
        chbx[i].setOnClickListener(new chBxOnclick());
    }

}
/*
 * here you have three options to create one onclick method to all of them or to create many onclicks for each on of them
 * or don't create onclick method for the checkboxes just check the state once it's all done like above
 * example for onclick for all of them
 */

public class chBxOnclick implements OnClickListener
{   public void onClick(View v)
{   switch((Integer)v.getTag())   
    {   case 0: dosomething();break;
        case 1: dothis();break;
        case 2: dathat(); break;
        .
        .
        .
        case 24: doFor24();break;
    }
}

}

}

1 голос
/ 03 июня 2011

сначала вам не нужно, чтобы они были окончательными, вы можете объявить их вне функции, тогда вам не будет предложено объявить их как окончательные.во-вторых, если вам нужно знать состояние флажков по мере их изменения, вы можете добавить слушателя к каждому из них с разной задачей, конечно, вы можете сделать это с помощью цикла, а затем этот цикл вызовет другую функцию, которая будетиметь тег этого chsckbox, и будет реагировать в соответствии с этим тегом.Если вам не нужно знать состояние, когда они изменяются, вы можете проверить их состояние, как только закончите с этим экраном, с помощью метода isSelected ().

Надеюсь, это поможет, С наилучшими пожеланиями.

...