当前位置: 首页 > 知识库问答 >
问题:

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

苏麒
2023-03-14

长话短说。

我有两个片段的主要活动。因此,这里不是主要活动,而是两个片段。在第一个片段中有一个开关。

当选中或取消选中开关时,是否可以从主活动更新背景?背景设置在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();
    }

在主要活动中:

SharedPreferences sharedPref = getSharedPreferences("my_prefs", Context.MODE_PRIVATE);
    int bg = sharedPref.getInt("background1", R.drawable.background1);
    getWindow().setBackgroundDrawableResource(bg);

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

提前谢谢各位

资料来源:

从另一个活动更改一个活动的背景

共有3个答案

安博文
2023-03-14

是的,这是可能实现的。我认为最简单的方法是通过侦听器/回调。

首先,创建listener类:

public interface MyCallback {
    void onSwitchStateChanged(boolean isChecked);
}

之后,让您的活动实现该接口,并在方法onSwitchStateChanged中实现后台更改逻辑。

现在,在片段的onAttach()方法中,执行以下操作(此示例使用静态编程语言):

override fun onAttach(context: Context?) {
    super.onAttach(context)
    if (context is MyCallback) {
        myListener = context as MyCallback
    }
    else {
        throw RuntimeException("Must implement MyCallback!")
    }
}

其中myListener是片段中的变量。

现在,在交换机上添加一个setoncheckedchangelister,如本答案中所述,并在其中使用回调。例如(在Java中):

mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        myListener.onSwitchStateChanged(isChecked);
    }
});
苍轶
2023-03-14

使用Otto事件总线,简单易行

点击此链接

将此添加到您的依赖项

implementation compile 'com.squareup:otto:1.3.8'

创建活动或片段添加此活动或片段

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);
}
邢法
2023-03-14

使用回调接口在片段和活动之间进行通信

请参阅以下代码段:

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
}

原件:

如何将数据从片段发送到活动

 类似资料:
  • 公共视图onCreateView(LayoutInflater inflater、ViewGroup容器、Bundle savedInstanceState){ 但是它崩溃了,错误日志如下所示: 是 我已经在中为添加了init,如下所示: 我的场景是: Activity1-->Activity1-->片段 Splash的XML如下所示: 我有两项活动。片段由activity2调用,我想改变Acti

  • 问题内容: 从Activity中包含的RecyclerView的适配器中,我试图在按下RecyclerView的元素时启动一个片段,这是我现在的代码: 我测试了它是否启动了我创建的一些“测试活动”,所以我知道除了片段启动之外的所有功能都可以正常工作。 错误在这里: 我正在启动作为活动的Fragment,所以当我运行应用程序时,它崩溃了,并告诉我在清单中将MainFragment声明为活动。 如何从

  • 我有两个活动,分别是家庭活动和沙拉菜单活动。主页活动包含七个片段,其中一个名为菜单类别的片段有四个图像,第一个图像下面的文本是沙拉菜单,当用户单击沙拉菜单时,将启动名为沙拉菜单活动的新活动。 我想,当用户点击后退按钮时,home活动必须开始,并且应该从启动salad菜单活动的相同片段开始,即home活动中的菜单类别片段。我希望每个活动都会发生这种情况,例如,如果用户从您的订单片段开始一个新的活动,

  • 如何在成功提交数据时将数据从本地数据库刷新到RecyclerView?我使用应用程序上的选项卡。函数提交数据,如果成功,数据将存储在中。 关于的数据将在中显示。但是发生的情况是,我必须滑动,然后滑动到,然后滑动到我的上成功显示的新的数据。 主要活动: 一切都很顺利,只是希望表单提交的时候数据能显示出来,可以直接在第3页签上查看

  • 问题内容: 我要在我的下一个Android项目中使用Retrofit 2.1.0。我想使用设计模式,因此为每个REST调用创建单独的类,即 IBalanceService.java BalanceRestClient.java BalanceActivity.java 如何通过onResponse()更新活动/片段中的UI? 附加信息: 最小SDK:19个 目标SDK:23个 使用OkHttp和g