Возможно ли, чтобы две кнопки (переключатели) имели синхронное поведение между фрагментами? то есть: когда кнопка A включена во фрагменте A, я хочу, чтобы внешний вид кнопки B во фрагменте B также отображался включенным.
Как бы я это сделал? Конечная цель - иметь глобальную кнопку на любом фрагменте.
Это будет зависеть от того, находятся ли оба фрагмента в одной и той же активности. Если да, то все, что вам нужно, - это логический флаг для указанной активности и синхронизация в зависимости от этого.
Если нет, то, возможно, создайте логическое предпочтение и выполните синхронизацию на его основе. Надеюсь это поможет. Если вам нужны примеры кода, дайте мне знать.
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);
}
}
Подробнее см. эта страница
Как мне получить флаг?
Не могли бы вы добавить более подробную информацию?
Вы можете использовать логический флаг в своей деятельности и установить его по умолчанию false, и когда любой из переключателей нажат в любом фрагменте, затем установите его значение в true, а когда вы переходите к другому фрагменту, тогда проверьте значение флага, и если его true, то переключите он включен или выключен.
У вас есть примеры?
Вот руководство разработчика по взаимодействию с другими фрагментами: https://developer.android.com/training/basics/fragments/communicating. В действии есть общий атрибут. В каждом фрагменте перейдите к родительскому действию, чтобы получить этот атрибут при нажатии кнопки. Чтобы уменьшить зависимость, используйте интерфейс для получения данных из действия, как показано в предоставленной ссылке.
У вас есть примеры с кнопками переключения?
Пример общения между фрагментами. Пример ниже изменен с Общение с другими фрагментами
Шаг 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 создать интерфейс в моем базовом классе фрагментов?
вы можете сделать это, если вам это подходит. Дизайн всегда решает проблему, если вы считаете это подходящим, я бы согласился с вами создать базовый фрагмент.
На шаге 3 "onAttach (Activity ..." устарел. Изменение слова "Activity" на "Context" устраняет ошибку. Как это повлияет на остальной код? Может ли он работать на KitKat Api?
Как показано здесь: stackoverflow.com/questions/32083053/…
Фрагмент onAttach (Context) находится в пакете android.support.v4.app. Пока вы используете библиотеку поддержки, все в порядке. Отметьте это как ответ, если он отвечает на ваш вопрос.
Я не думаю, что этот код работает с переключателем. Я пробовал его модифицировать и получил слишком много синтаксических ошибок.
я пропустил скобу, и я ее починил.
И последнее: в MainActivity появляется ошибка «на нестатический метод setGlobalButtonState (boolean)» нельзя ссылаться из статического контекста ».
это класс фрагмента. github.com/hjchin/POS/blob/master/app/src/main/java/pos/com/ pos /…. вы можете найти onAttach, определение интерфейса обратного вызова и обратный вызов в классе адаптера DiscountAdapter.
Я думаю, что хорошо публиковать свой код, то есть свой прогресс, чтобы вы могли изучать и удалять ошибки одну за другой. для последней ошибки, которую вы видите, я думаю, вы используете класс фрагмента, а не экземпляр фрагмента. Вам необходимо получить экземпляр фрагмента FragmentB с помощью соответствующего метода, такого как developer.android.com/reference/android/support/v4/app/…
Оба фрагмента проходят через адаптер пейджера в одном действии. Не могли бы вы привести примеры?