Как сфокусировать поля ввода при нажатии на кнопку «Tab» в Unity 3D - PullRequest
0 голосов
/ 25 июня 2018

enter image description here Я хочу, чтобы поля ввода фокусировались с помощью кнопки табуляции. Я нашел некоторый код для фокусировки полей ввода, но он не удовлетворял моим требованиям. В моем приложении один дизайн страницы, как номер поля ввода в горизонтальном и вертикальном формате. На моей странице есть 3 строки поля ввода, и каждая строка имеет 3 поля ввода. Мое требование - когда пользователь нажимает кнопку табуляции, фокусируется на следующем поле ввода, оно работает, но как добраться до конца строки, как я могу сфокусировать следующую строку, содержащую поле ввода. Пожалуйста, предложите любую идею. Спасибо. Вы можете найти мой образец страницы ниже.

Вот код, который я пробовал.

Selectable next = system.currentSelectedGameObject.GetComponent<Selectable().FindSelectableOnRight();                               
if (next != null)
{
    InputField inputfield = next.GetComponent<InputField>();

    if (inputfield != null)
    {                       
        inputfield.OnPointerClick(new PointerEventData(system)); 
        system.SetSelectedGameObject(next.gameObject, new BaseEventData(system));
    }
}

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Вот мое решение, очень похожее.

public class TabToNextController : MonoBehaviour {

    public InputField nextField;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        if (GetComponent<InputField> ().isFocused && Input.GetKeyDown (KeyCode.Tab)) {
            nextField.ActivateInputField ();
        }
}

Просто добавьте этот скрипт к элементу, из которого вы хотите получить вкладку Затем в графическом интерфейсе в поле ввода, к которому вы хотите добавить вкладку «nextField».

0 голосов
/ 20 февраля 2019

Я недавно столкнулся с этой проблемой, и я с ума сошел от мысли, что там нет функции вкладок. Я никогда не замечал этого раньше. Простое решение, которое до сих пор работает, - это использование класса Selectable, от которого наследуются элементы пользовательского интерфейса.

Я проверил это с наиболее распространенными (для меня) типами - InputField, Buttons и выпадающими списками.

  • Это вкладок к каждому из них, как и ожидалось
  • используйте пробел, чтобы нажать кнопку
  • используйте пробел, чтобы открыть выпадающий список

Если вы хотите, чтобы полные элементы управления в веб-стиле (например, клавиши со стрелками) вызывали выпадающий список, вам нужно написать этот код.

public class TabToNextController : MonoBehaviour, IUpdateSelectedHandler
{
    public Selectable nextField;

    public void OnUpdateSelected(BaseEventData data)
    {
        if (Input.GetKeyDown(KeyCode.Tab))
            nextField.Select();
    }
}

Приветствия

0 голосов
/ 25 июня 2018

Я реализовал аналогичную функцию NGUI, вы можете внести некоторые изменения, если используете UGUI.Идея заключается в установке nextInput вручную с помощью общедоступной переменной

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UIInputTab : MonoBehaviour {

    UIInput thisInput;
    public GameObject nextInput;
    void Start () {
        thisInput = transform.GetComponent<UIInput>();
    }

    void Update () {
        if (thisInput.isSelected)
        {
            if (nextInput != null && Input.GetKeyDown(KeyCode.Tab))
            {
                UICamera.selectedObject = nextInput;
            }
        }
    }
}

Update

: динамически генерировать случайное число InputField и назначать следующий InputField.

InputfieldTest.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class InputfieldTest : MonoBehaviour {

    public GameObject inputFieldPrefab;
    public GameObject panel;
    private GameObject lastInput;

    EventSystem m_EventSystem;

    void Start () {

        m_EventSystem = EventSystem.current;

        for(int i = 0; i < Random.Range(5,10);i++){
            GameObject column = new GameObject();
            column.transform.parent = panel.transform;
            column.name = "Column" + i;

            for (int j = 0; j < Random.Range(2, 8);j++){
                GameObject input = Instantiate(inputFieldPrefab);
                input.transform.parent = column.transform;
                input.GetComponent<RectTransform>().position = new Vector3(300+ 200 * j, 300+ 200 * i, 0);
                input.name = "InputField" + i + "-" + j;

                // set nextInput
                if(lastInput != null) {
                    lastInput.GetComponent<InputTabControl>().nextInput = input;
                }

                lastInput = input;
            }
        }
    }

    void Update () {
        GameObject currentSelect = m_EventSystem.currentSelectedGameObject;

        if (currentSelect != null)
        {
            print(currentSelect.name);
            GameObject nextInput = currentSelect.GetComponent<InputTabControl>().nextInput;
            if (nextInput != null && Input.GetKeyDown(KeyCode.Tab))
            {
                InputField inputfield = nextInput.GetComponent<InputField>();

                if (inputfield != null)
                {
                    inputfield.OnPointerClick(new PointerEventData(m_EventSystem));
                    m_EventSystem.SetSelectedGameObject(nextInput.gameObject, new BaseEventData(m_EventSystem));
                }
            }
        }
    }
}

InputTabControl.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InputTabControl : MonoBehaviour {

    public GameObject nextInput;

}

Результат:

enter image description here

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...