我有两个片段的mainActivity。因此,有两个片段代替了mainActivity。 在第一个片段中有一个开关。
在选中或未选中该开关时,是否可以从mainActivity更新背景? Background是在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);
还是因为该片段本身未加载新的内容而仅仅是不可能? 如果是这样的话。这怎么可能?
先谢谢大家
来源:
答案 0 :(得分:2)
使用回调接口在片段和您的活动之间进行通信
请参见以下代码段:
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
}
原文:
答案 1 :(得分:2)
使用Otto事件总线,简单易行
点击此link
将此添加到您的依赖项
implementation compile 'com.squareup:otto:1.3.8'
Activity或Fragment 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);
}
答案 2 :(得分:1)
是的,有可能实现这一目标。我认为最简单的方法是通过侦听器/回调。
首先,创建您的侦听器类:
public interface MyCallback {
void onSwitchStateChanged(boolean isChecked);
}
然后,让您的Activity实现该接口,并在onSwitchStateChanged
方法内实现后台更改逻辑。
现在,在Fragment的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
是片段中的变量。
现在像在this answer中所述,在交换机上添加一个setOnCheckedChangeListener
,并在其中使用回调。例如(在Java中):
mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
myListener.onSwitchStateChanged(isChecked);
}
});