короче говоря.
У меня есть mainActivity с двумя фрагментами. Итак, вместо mainActivity есть два фрагмента. В первом фрагменте есть переключатель.
Можно ли обновить фон из mainActivity, когда переключатель отмечен или снят? Фон устанавливается в content_main.xml, потому что тогда у вас нет перехода при изменении фрагментов.
Так возможно ли это вообще?
Я думал, что это сработает:
if (switch.isChecked()) {
SharedPreferences sharedPref = getActivity().getSharedPreferences("my_prefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt("background1", R.drawable.background2);
editor.apply();
}
И в MainActivity:
SharedPreferences sharedPref = getSharedPreferences("my_prefs", Context.MODE_PRIVATE);
int bg = sharedPref.getInt("background1", R.drawable.background1);
getWindow().setBackgroundDrawableResource(bg);
Или это просто невозможно, потому что фрагмент не загружается сам по себе? Если так. Как это возможно?
Заранее спасибо, ребята
источник:
Используйте интерфейс обратного вызова для связи между фрагментом и вашей активностью
См. Приведенный ниже фрагмент кода:
public class YourFragment extends Fragment{
OnCallbackReceived mCallback;
// Implement this interface in your Activity.
public interface OnCallbackReceived {
public void Update(boolean state);
}
В вашем фрагменте:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mCallback = (OnCallbackReceived) activity;
} catch (ClassCastException e) {
}
}
// You can Call the event from fragment as mentioned below
// mCallback is the activity context.
mCallback.Update(switch.isChecked());
Мероприятия :
public class MainActivity extends Activity
implements YourFragment.OnCallbackReceived {
// Implemented method.
public override void Update(boolean state) {
// Update bg here
}
Оригинал:
Да, это возможно. Я думаю, что самый простой способ сделать это - использовать прослушиватель / обратный вызов.
Прежде всего, создайте свой класс слушателя:
public interface MyCallback {
void onSwitchStateChanged(boolean isChecked);
}
После этого заставьте вашу Activity реализовать этот интерфейс и реализовать логику изменения фона внутри метода onSwitchStateChanged
.
Теперь внутри метода onAttach()
вашего фрагмента сделайте следующее (этот пример находится в Kotlin):
override fun onAttach(context: Context?) {
super.onAttach(context)
if (context is MyCallback) {
myListener = context as MyCallback
}
else {
throw RuntimeException("Must implement MyCallback!")
}
}
Где myListener
- это переменная внутри вашего фрагмента.
Теперь добавьте setOnCheckedChangeListener
на свой коммутатор, как описано в этот ответ, и используйте обратный вызов внутри него. Например (на Java):
mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
myListener.onSwitchStateChanged(isChecked);
}
});
использовать шину событий Otto, это легко и просто
Щелкните этот ссылка на сайт
добавьте это в свои зависимости
implementation compile 'com.squareup:otto:1.3.8'
Активность или фрагмент onCreate добавить этот
Bus bus = new Bus();
Вы можете опубликовать подобное событие из своей активности или фрагмента
bus.post(new AnswerAvailableEvent(42));
если вы хотите получать события, даже когда ваш фрагмент находится на переднем или заднем плане, подпишитесь на события, как показано ниже
@Subscribe public void answerAvailable(AnswerAvailableEvent event) {
// TODO: React to the event somehow!
}
Не забудьте зарегистрироваться и отменить регистрацию в onStart и onStop
@Override
protected void onStart(){
super.onStart();
bus.register(this);
}
@Override
protected void onStop(){
super.onStop();
bus.unregister(this);
}
Хотя использование EventBus могло бы решить его проблему, ваш ответ - только ссылка, попробуйте улучшить ее. Для получения дополнительной информации см. "Как мне написать хороший ответ?" в Справочном центре.
Отлично, спасибо! Чтобы переключить его обратно, я добавил в
onCheckedChanged
методif (isChecked == true) { background.setBackgroundResource(R.drawable.background1); } else { background.setBackgroundResource(R.drawable.background2); }
. Так что он отлично работает. Еще раз спасибо!