переопределить / прослушать setMethod в экземпляре объекта - PullRequest
0 голосов
/ 03 декабря 2018

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

Мой реальный вариант использования: я хочу сделать что-то, когда фрагмент виден пользователю, но я хочу сделать это в классе приложения (своего рода библиотека), поэтому я нене хочу взаимодействовать с кодом пользователя.

Пример кода:

this.getSupportFragmentManager()
.registerFragmentLifecycleCallbacks(new FragmentManager
.FragmentLifecycleCallbacks() {
   @Override
   public void onFragmentCreated(FragmentManager fm, Fragment f, Bundle savedInstanceState) {

     if(f.getUserVisibleHint()){
        //do something
     }
     /* unfortunately this code will executed once when fragment is created 
        but the value of "getUserVisibleHint" will be changed 
     */
   }
});

Поскольку mUserVisibleHint является закрытым, я осторожно спрашиваю, есть ли способ переопределить setUserVisibleHint, чтобы знать, что это значение переменнойизменилось ??

1 Ответ

0 голосов
/ 03 декабря 2018

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

public interface FragmentVisibilityListener{
     void onVisibilityChanged(boolean visible, Fragment fragment);
}

И затем создать класс, которому этот фрагмент сообщаетя видим или скрыт.

public class FragmentVisibilityHandler{ 
   private static FragmentVisibilityHandler instance;
   private FragmentVisibilityListener visibilityListener;
   public static FragmentVisibilityHandler getInstance(){
          if(instance == null)
             instance = new FragmentVisibilityHandler();
          return instance;
   }
   public void setVisibilityListener(FragmentVisibilityListener listener){
       visibilityListener = listener;
   }
   //you should use this methods in your fragments!
   public void stateChanges(boolean action, Fragment fragment){
         if(visibilityListener != null){
             this.visibilityListener(action,fragment);
         }
   }
}

В вашем фрагменте звонки

public class MyFragment extends Fragment{
@Override
public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        FragmentVisibilityHandler.getInstance().stateChanges(hidden, this);
    }
}

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

public class MyApplication extends Application implements FragmentVisibilityListener{
     void inSomeMethod(){
        FragmentVisibilityHandler.getInstance().setVisibilityListener(this);
     }
     void onVisibilityChanged(boolean visible, Fragment fragment){
          Log.i("MyApplication",fragment.toString()+" becomes "+ hidden ? "visible" : "invisible" );
     }
}

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

...