Как обновить фрагмент и фон в другом действии

короче говоря.

У меня есть 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);

Или это просто невозможно, потому что фрагмент не загружается сам по себе? Если так. Как это возможно?

Заранее спасибо, ребята

источник:

Изменение фона действия из другого действия

1
0
778
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

См. Приведенный ниже фрагмент кода:

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);
    }
});

Отлично, спасибо! Чтобы переключить его обратно, я добавил в onCheckedChanged метод if (isChecked == true) { background.setBackgroundResource(R.drawable.background1); } else { background.setBackgroundResource(R.drawable.background2); }. Так что он отлично работает. Еще раз спасибо!

Hansi 18.12.2018 19:08

использовать шину событий 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 могло бы решить его проблему, ваш ответ - только ссылка, попробуйте улучшить ее. Для получения дополнительной информации см. "Как мне написать хороший ответ?" в Справочном центре.

Mauker 18.12.2018 16:11

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