Как обновить Фрагмент и Фон в другой Деятельности - PullRequest
0 голосов
/ 18 декабря 2018

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

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

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

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

источник:

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

Ответы [ 3 ]

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

Да, это возможно.Я думаю, что самый простой способ сделать это через слушателя / обратный вызов.

Прежде всего, создайте свой класс слушателя:

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);
    }
});
0 голосов
/ 18 декабря 2018

используйте шину событий Отто, это просто и просто

Нажмите эту ссылку

добавьте это к своим зависимостям

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);
}
0 голосов
/ 18 декабря 2018

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

Пожалуйста, посмотрите фрагмент кода ниже:

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
}

Оригинал:

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

...