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

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

Как бы я это сделал? Конечная цель - иметь глобальную кнопку на любом фрагменте.

0
0
250
4

Ответы 4

Это будет зависеть от того, находятся ли оба фрагмента в одной и той же активности. Если да, то все, что вам нужно, - это логический флаг для указанной активности и синхронизация в зависимости от этого.

Если нет, то, возможно, создайте логическое предпочтение и выполните синхронизацию на его основе. Надеюсь это поможет. Если вам нужны примеры кода, дайте мне знать.

public interface Listener {
 public boolean getFlag();
 public void setFlag(boolean enable);
}

public class SomeActivity extends AppCompatActivity implements Listener {
// getFlag, setFlag implementation
}

public class FragmentA {
 private boolean state;
 private Listener listener;
 private Switch switchBtn;

 public void onAttach(Context ctx){
  listener = (Listener) this.getActivity();
  // check for ClassCast Exception
 }
 public void onActivityCreated() {
   state = listener.getFlag();
   switchBtn.setChecked(state);
 }
}

Подробнее см. эта страница

Оба фрагмента проходят через адаптер пейджера в одном действии. Не могли бы вы привести примеры?

Bread 23.07.2018 07:05

Как мне получить флаг?

Bread 07.08.2018 23:24

Не могли бы вы добавить более подробную информацию?

Bread 07.08.2018 23:35

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

У вас есть примеры?

Bread 23.07.2018 07:29

Вот руководство разработчика по взаимодействию с другими фрагментами: https://developer.android.com/training/basics/fragments/communicating. В действии есть общий атрибут. В каждом фрагменте перейдите к родительскому действию, чтобы получить этот атрибут при нажатии кнопки. Чтобы уменьшить зависимость, используйте интерфейс для получения данных из действия, как показано в предоставленной ссылке.

У вас есть примеры с кнопками переключения?

Bread 07.08.2018 23:36

Пример общения между фрагментами. Пример ниже изменен с Общение с другими фрагментами

Шаг 1. Создать интерфейс

public interface ButtonCallback{
    void onClick(boolean val)
}

Шаг 2. В HostActivity, который содержит оба фрагмента A и B, make HostActivity реализует интерфейс ButtonCallback.

public class HostActivity extends AppCompatActivity implements ButtonCallback{

    void onClick(boolean val){
    }
}

Шаг 3. Во фрагменте A и B инициализируйте обратный вызов с приведением действия

class FragmentA extends Fragment{

    ButtonCallback callback;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        //Make sure activity host implement ButtonCallback interface
        try {
            callback= (ButtonCallback ) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
            + " must implement ButtonCallback");
        }
    }

    //public method to update fragment's button state
    public void setGlobalButtonState(boolean val){
        //globalButton has been initialized in onCreateView function
        globalButton.setEnabled(val);
    }
}

class FragmentB extends Fragment{

    ButtonCallback callback;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        try {
            callback= (ButtonCallback ) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
            + " must implement ButtonCallback");
        }
    }

    public void setGlobalButtonState(boolean val){
        //globalButton has been initialized in onCreateView function
        globalButton.setEnabled(val);
    }
}

Шаг 4. Во фрагменте A вызовите ButtonCallback.onClick (логическое значение), когда пользователь нажимает кнопку

globalButton.setOnClickListener(new View.OnClickListener(View v){
    Boolean value  = !v.isEnabled();
    callback.onClick(value)
});

Шаг 5. В функции HostActivity onClick найдите способ получить фрагмент B, соответствующий вашему контексту, и обновите кнопку во фрагменте B с помощью функции setGlobalButtonState.

void onClick(boolean val){
    //get Fragment B.
    fragmentB.setGlobalButtonState(val);
}

Дополнительное примечание: если кнопка должна быть глобальной, возможно, стоит подумать о том, чтобы вместо этого поместить кнопку в Activity хоста, если это соответствует вашему контексту.

Следует ли на шаге 1 создать интерфейс в моем базовом классе фрагментов?

Bread 03.08.2018 02:41

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

hjchin 03.08.2018 04:32

На шаге 3 "onAttach (Activity ..." устарел. Изменение слова "Activity" на "Context" устраняет ошибку. Как это повлияет на остальной код? Может ли он работать на KitKat Api?

Bread 05.08.2018 23:15

Как показано здесь: stackoverflow.com/questions/32083053/…

Bread 05.08.2018 23:17

Фрагмент onAttach (Context) находится в пакете android.support.v4.app. Пока вы используете библиотеку поддержки, все в порядке. Отметьте это как ответ, если он отвечает на ваш вопрос.

hjchin 06.08.2018 05:17

Я не думаю, что этот код работает с переключателем. Я пробовал его модифицировать и получил слишком много синтаксических ошибок.

Bread 07.08.2018 02:27

я пропустил скобу, и я ее починил.

hjchin 07.08.2018 03:27

И последнее: в MainActivity появляется ошибка «на нестатический метод setGlobalButtonState (boolean)» нельзя ссылаться из статического контекста ».

Bread 07.08.2018 22:47

это класс фрагмента. github.com/hjchin/POS/blob/master/app/src/main/java/pos/com/‌ pos /…. вы можете найти onAttach, определение интерфейса обратного вызова и обратный вызов в классе адаптера DiscountAdapter.

hjchin 08.08.2018 03:18

Я думаю, что хорошо публиковать свой код, то есть свой прогресс, чтобы вы могли изучать и удалять ошибки одну за другой. для последней ошибки, которую вы видите, я думаю, вы используете класс фрагмента, а не экземпляр фрагмента. Вам необходимо получить экземпляр фрагмента FragmentB с помощью соответствующего метода, такого как developer.android.com/reference/android/support/v4/app/…

hjchin 08.08.2018 03:24

Другие вопросы по теме