繁体   English   中英

如何从另一个类调用 Activity 类方法?

[英]How do I call Activity class method from another class?

我有一个从服务器接收设置的 Config 类。 然后将这些设置应用到名为 ApplySettings() 的活动方法中。 我将此 ApplySettings() 函数称为 onCreate 函数。 第一次工作正常,但我无法检测到 Activity 类中的设置更改。 我想在设置更改后立即从 Config 类调用此 ApplySettings() 方法。 我怎样才能做到这一点? 谢谢

Config.Java //Singleton class
public class Config
{
  public String name = "";
  public void getSettingsFromServer()
  {
    name = "";//name received from server
  }    
}




MyActivity.java
public class SettingsSystem extends AppCompatActivity
{
  private Config config = Config.getInstance();
  protected void onCreate (Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings_system);
    ApplySettings();
  }
  public void ApplySettings()
  {
    //settings are applied here
  }    
}

这两个类都在单独的文件中。

您可能希望将MyActivity的实例存储在您的配置类中。

Config.java添加一个方法:

public class Config
{
  public String name = "";
  private SettingsSystem activity;
  public void getSettingsFromServer()
  {
    name = "";//name received from server
  }

  public void setMyActivity(SettingsSystem activity) 
  {
    this.activity = activity;
  }

  public void applyChanges()
  {
    if (this.activity != null)
    {
      this.activity.ApplySettings();
    }
  }    
}

然后在您的MyActivity类中,您可以执行以下操作:

public void setConfigActivity() 
{
  this.config.setMyActivity(this);
}

现在您的配置实例具有 SettingsSystem。

笔记

方法不应以大写字母开头。 这违反了 Java 编码标准。 你也说它的MyActivity.java但将它显示为SettingsSystem在这里需要一致性,因为它不会编译。

循环依赖也是不好的做法。 可能想重新考虑这两个类如何相互作用。

您可以使用EventBus来实现您想要的。

1.新建一个名为SettingsChangedEvent

final public class SettingsChangedEvent { /* Additional fields if needed */ }

2.在Config类中的getSettingsFromServer()方法中添加以下代码

public void getSettingsFromServer() {
    name = ""; //name received from server
    // [ADD THIS] Notify to activity that settings are changed, 
    // it should apply new settings
    EventBus.getDefault().postSticky(new SettingsChangedEvent());
}

3.将这些方法添加到SettingsSystem活动

@Override
protected void onStart() {
    super.onStart();
    // Allow this activity to listen settings changed event
    EventBus.getDefault().register(this);
}

@Override
protected void onStop() {
    // Disallow this activity from listening settings changed event
    EventBus.getDefault().unregister(this);
    super.onStop();
}

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onSettingsChangedEvent(SettingsChangedEvent ev) {
    // When settings changed event is notified/posted from Config class, 
    // the code inside this method will be executed.
    SettingsChangedEvent event = EventBus.getDefault().removeStickyEvent(SettingsChangedEvent.class);
    if (event != null) {
        // Apply new settings here
        ApplySettings();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM