2016-08-25 4 views
0

Я хотел бы проверить мой класс MainActivity, если был изменен Switch в Fragment. Поэтому прямо сейчас у меня есть класс Fragment и основной класс (ActivityName).Switch.setOnCheckedChangeListener в MainActivity вместо фрагмента

Я уже пытался получить ссылку из Фрагмента в свой основной класс активности, но это не работает из-за того, что я не знаю, когда его называть (он говорит, что всегда нулевая ссылка, я думаю, это из-за onviewcreated hasn 't был вызван, если я попробую это).

Я могу создать Switch.setOnCheckedChangeListener в своем фрагменте, но не в основном классе. (Похоже, это)

public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     switchA = (Switch) getView().findViewById(R.id.switchA); 

     switchA.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

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

       } 
       else{ 

       } 
      } 
     }); 

так, Что лучший выбор, чтобы получить эту информацию из моего класса Fragment моего класса активности?

Я благодарен за любые советы :)

Любые предложения будут оценены.

+1

Вы можете использовать интерфейс между активностью и фрагмент. По интерфейсу вы можете перезвать активность из фрагмента. –

ответ

2

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

ChackedChangedCallback.java:

public interface CheckedChangeCallback() { 
    void onCheckedChanged(boolean isChecked); 
} 

в фрагменте:

private CheckedChangeCallback callback = null; 

public void onAttach(final Activity activity) { 
    super.onAttach(activity); 
    if (activity instanceof CheckedChangeCallback) { 
     this.callback = (CheckedChangeCallback) activity; 
    } 
} 

public void onDetach() { 
    super.onDetach(); 
    callback = null; 
} 

public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     switchA = (Switch) getView().findViewById(R.id.switchA); 

     switchA.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       callback.onCheckedChange(isChecked); 
      } 
     }); 

В деятельности :

public class YourActivity extends AppCompatActivity implements CheckedChangeCallback { 

    ... 

    @Override 
    public void onCheckedChange(boolean isChecked) { 
     // do stuff here 
    } 

} 
+0

wow, что было быстро, спасибо, много работает :) –

-1

В вашем Activity

static ActivityName activity; 

в onCreate методом Activity

activity = this; 

Теперь создайте метод в Activity

public static ActivityName getInstance() 
{ 
     return activity; 
} 

метод Теперь создаем для handelling Switch метод в Activity (главный класс)

public void handleSwitch(boolean value) 
{ 
     if(value) 
     { 
      ..... 
     } 
     else 
     { 
      ...... 
     } 
} 

Сейчас в Fragment

public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    switchA = (Switch) getView().findViewById(R.id.switchA); 

    switchA.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

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


      ActivityName.getInstance().handleSwitch(isChecked); 


      if(isChecked){ 

      } 
      else{ 

      } 
     } 
    }); 
+0

Вы не должны хранить активность в статическом поле (утечка памяти). – pawelo

+0

wow, который был быстрым, спасибо много, но я выбрал решение для интерфейса, у всех есть хороший день :) –

+0

@pawelo спасибо за руководство –

1

Быстрое решение было бы создать функцию, которая обрабатывает Main проверенного статуса коммутатора. Затем в своем фрагменте вы можете вызвать эту функцию для обращения к переключателю с помощью метода getActivity().FunctionName() Таким образом, вы бы в вашей основной, например:

public void handleSwitchClick(boolean checked) { 
    if (checked) { 
     // do something 
    else { 
     // do something else 
    } 
} 

и во фрагменте:

public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    switchA = (Switch) getView().findViewById(R.id.switchA); 

    switchA.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       getActivity().handleSwitchClick(isChecked); 
     } 
    }); 

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

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

private boolean switchChecked = false; 

public void handleSwitchClick(boolean checked) { 
    if (checked) { 
     switchChecked = true; 
     // do something 
    else { 
    switchChecked = false; 
     // do something else 
    } 
} 
+0

спасибо за этот быстрый ответ, но я выбрал интерфейс «руководство» в качестве решения , хорошего дня –