如何在另一个活动中更新片段和背景

时间:2018-12-18 14:24:52

标签: android android-activity fragment

长话短说。

我有两个片段的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);

还是因为该片段本身未加载新的内容而仅仅是不可能? 如果是这样的话。这怎么可能?

先谢谢大家

来源:

Changing background of an activity from another activity

3 个答案:

答案 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
}

原文:

How to send data from fragment to activity

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