Java: установка нескольких переменных через один аргумент функции

#java #android

#java #Android

Вопрос:

У меня есть 7 флажков для каждого дня недели, объявленных следующим образом:

 CheckView MondayTextBox;
CheckView TuesdayTextBox;
CheckView WednesdayTextBox;
...
  

А затем в oncreate они инициализируются следующим образом:

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            // Inflate the layout for this fragment
            View view = inflater.inflate(R.layout.fragment_add_alarm, container, false);

            MondayTextBox = (CheckView) view.findViewById(R.id.mondayButton);
            TuesdayTextBox = (CheckView) view.findViewById(R.id.tuesdayButton);
            WednesdayTextBox = (CheckView) view.findViewById(R.id.wednesdayButton);
            ...
  

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

             MondayTextBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                selectAndAnimateTheCheckBoxes(mondaySelected, MondayTextBox);
            }
        });

        TuesdayTextBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                selectAndAnimateTheCheckBoxes(tuesdaySelected, TuesdayTextBox);
            }
        });
        ...
  

Который вызывает функцию selectAndAnimateTheCheckBoxes:

 public void selectAndAnimateTheCheckBoxes(Boolean daySelected, CheckView dayTextBox) {
    if (!daySelected) {
        daySelected = true;
        dayTextBox.animate().alpha(1F).setDuration(300);
    } else {
        daySelected = false;
        dayTextBox.animate().alpha(0.3F).setDuration(300);
    }
}
  

Возможно ли передать не только значение переменной, но и саму переменную через функцию? Или переменная должна быть явно указана и установлена аргументом функции.

P.s. Я знаю, как заставить эту функцию работать, я никогда даже не думал об этом раньше, и мне интересно, возможно ли это.

Заранее спасибо за вашу помощь.

Ответ №1:

Вы можете setOnCheckedChangeListener установить свои флажки следующим образом

 MondayTextBox.setOnCheckedChangeListener(this);
.
.
  

и переопределите метод

 @Override
   public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

    switch (buttonView.getId()){
        case R.id.mondayButton:

            if(isChecked == true) {
                Toast.makeText(this, "Checked", Toast.LENGTH_SHORT).show();
            } else{
                    Toast.makeText(this, "Unchecked", Toast.LENGTH_SHORT).show();
                   }

            break;
         }

      }
  

Комментарии:

1. Хорошо, спасибо, поэтому нет практического способа сделать это только для каждого случая. Спасибо

Ответ №2:

Вы можете сделать следующее :

 public class MainActivity extends Activity implements OnClickListener{

CheckView MondayTextBox;
CheckView TuesdayTextBox;
CheckView WednesdayTextBox;
...

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
       View view = inflater.inflate(R.layout.fragment_add_alarm, container, false);

       MondayTextBox = (CheckView) view.findViewById(R.id.mondayButton);
       TuesdayTextBox = (CheckView) view.findViewById(R.id.tuesdayButton);
       WednesdayTextBox = (CheckView) view.findViewById(R.id.wednesdayButton);

       ...
       MondayTextBox.setOnClickListener(this);
       TuesdayTextBox.setOnClickListener(this);
       WednesdayTextBox.setOnClickListener(this);
       ...
  }

  @Override
  public void onClick(View v) {

  switch (v) {

   case MondayTextBox :
   selectAndAnimateTheCheckBoxes(mondaySelected, MondayTextBox);
   break;

   case TuesdayTextBox:
   selectAndAnimateTheCheckBoxes(tuesdaySelected, TuesdayTextBox);
   break;
   ...

   }

  }
}
  

Комментарии:

1. Спасибо, Айан, но это просто еще один способ выполнения onClick, который ничем не отличается от неисправного кода, который я показывал ранее. Хотя спасибо.

2. Проверьте мой другой ответ @NicholasMuir

Ответ №3:

Вероятно, это то, что вы ищете:

 CheckView chk[];
Boolean daySelected[];

chk=new CheckView [7];
daySelected=new daySelected[7];

chk[0]=(CheckView) view.findViewById(R.id.mondayButton);
chk[1]=(CheckView) view.findViewById(R.id.tuesdayButton);
...


for (int i = 0; i < 7; i  ) {
    chk[i].setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            selectAndAnimateTheCheckBoxes(daySelected[i], chk[i]);
        }
    });
}