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

时间:2020-10-22 17:04:52

标签: java android

我有一个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
  }    
}

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

2 个答案:

答案 0 :(得分:1)

您希望将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,此处将需要一致性,因为它将无法编译。

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

答案 1 :(得分:1)

您可以使用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();
    }
}