# OnActivate(string, VisualElement)

> Use this function to implement a handler for when the user clicks on the Settings in the Settings window. You can fetch a settings Asset or set up UIElements UI from this function.

## Definition

* **Type:** Method
* **Namespace:** [UnityEditor](/engine/6000.5/script-reference/unityeditor.md)
* **Assembly:** UnityEditor.CoreModule

```csharp
public virtual void OnActivate(string searchContext, VisualElement rootElement)
```

### Parameters

**** (\[string]\(https\://learn.microsoft.com/dotnet/api/system.string)): Search context in the search box on the Settings window.**** (\[VisualElement]\(/engine/6000.5/script-reference/unityengine/uielements/visualelement)): Root of the UIElements tree. If you add to this root, the SettingsProvider uses UIElements instead of calling [SettingsProvider.OnGUI](/engine/6000.5/script-reference/unityeditor/settingsprovider/ongui.md) to build the UI. If you do not add to this VisualElement, then you must use the IMGUI to build the UI.

### Remarks

```csharp
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

class SimpleIMGUISettingsProvider : SettingsProvider
{
    SerializedObject m_Settings;
    const string k_MyCustomSettingsPath = "Assets/Editor/MyCustomSettings.asset";
    public SimpleIMGUISettingsProvider(string path, SettingsScope scope = SettingsScope.User)
        : base(path, scope) {}

    public override void OnActivate(string searchContext, VisualElement rootElement)
    {
        // Called when the user clicks on the MyCustom element in the Settings window
        m_Settings = new SerializedObject(AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(k_MyCustomSettingsPath));
    }

    public override void OnDeactivate()
    {
        // User selected another setting or closed the Settings window
        m_Settings = null;
    }

    public override void OnGUI(string searchContext)
    {
        // Use IMGUI to display UI:
        EditorGUILayout.PropertyField(m_Settings.FindProperty("m_Number"), new GUIContent("My Number"));
        EditorGUILayout.PropertyField(m_Settings.FindProperty("m_SomeString"), new GUIContent("Some string"));
        m_Settings.ApplyModifiedPropertiesWithoutUndo();
    }
}
```

This example shows how to build a SettingsProvider based on UIElements: you need to add any children to the rootElement passed to OnActivate.

```csharp
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
using UnityEditor.UIElements;

class SimpleUIElementsSettingsProvider : SettingsProvider
{
    SerializedObject m_Settings;
    const string k_MyCustomSettingsPath = "Assets/Editor/MyCustomSettings.asset";
    public SimpleUIElementsSettingsProvider(string path, SettingsScope scope = SettingsScope.User)
        : base(path, scope) {}

    public override void OnActivate(string searchContext, VisualElement rootElement)
    {
        // Called when the user clicks on the MyCustom element in the Settings window
        m_Settings = new SerializedObject(AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(k_MyCustomSettingsPath));

        // rootElement is a VisualElement. If you add any children to it, you are using UIElements to build the SettingsProvider
        var styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>("Assets/Editor/settings_ui.uss");
        rootElement.styleSheets.Add(styleSheet);
        var title = new Label()
        {
            text = "Custom UI Elements"
        };
        title.AddToClassList("title");
        rootElement.Add(title);

        rootElement.Add(new PropertyField(m_Settings.FindProperty("m_SomeString")));
        rootElement.Add(new PropertyField(m_Settings.FindProperty("m_Number")));

        rootElement.Bind(m_Settings);
    }

    public override void OnGUI(string searchContext)
    {
        // This function is never called since UIElements is drawing the UI.
    }
}
```
