Изменение EditText при повороте по горизонтали [дубликат]

Это очень распространенная проблема, возникающая из-за непонимания работы :nth-child() и :nth-of-type(). К сожалению, в настоящее время нет решения на основе селектора, поскольку селектор не обеспечивает способ сопоставления n-го дочернего элемента, который соответствует произвольному селектору на основе шаблона, такого как нечетные, четные или любые an+b, где a != 1 и b != 0.

:nth-child() псевдокласса подсчитывает элементы среди всех всех их братьев и сестер под одним и тем же родителем. Он не учитывает только братьев и сестер, которые соответствуют остальной части селектора. Аналогично, псевдо-класс :nth-of-type() считает, что siblings используют один и тот же тип элемента, который относится к имени тега в HTML, а не к остальной части селектора.

Это также означает, что если все дочерние элементы одного и того же родителя имеют один и тот же тип элемента, например, в случае тела таблицы, единственными дочерними элементами которого являются tr или элемент списка, единственными дочерними элементами которого являются li, тогда :nth-child() и :nth-of-type() будут вести себя одинаково, т. е. для каждого значения an+b, :nth-child(an+b) и :nth-of-type(an+b) будут соответствовать одному и тому же набору элементов.

На самом деле все простые селектора в данном соединении селектор, включая псевдоклассы, такие как :nth-child() и :not(), работают независимо друг от друга , вместо того, чтобы смотреть на подмножество элементов, которые сопоставляются остальными селектора.

Это также подразумевает, что нет понятия порядка среди простых селекторов в каждом отдельном селекторе 1, что означает, например, следующие два селектора эквивалентны:

[f 1]

При переводе на английский язык оба означают:

Выберите любой элемент tr, который соответствует всем следующим независимым условиям:

  • нечетный номер родительского родителя;
  • имеет класс «строка»; и
  • является потомком элемента table, который имеет класс «myClass».

(вы заметите, что мое использование неупорядоченный список здесь, просто для того, чтобы управлять точкой.)

Поскольку в настоящее время нет чистого решения CSS, вам придется использовать скрипт для фильтрации элементов и соответственно применять стили или дополнительные имена классов. Например, следующее обходное решение, использующее jQuery (предполагается, что в таблице есть только одна группа строк, заполненная элементами tr):

$('table.myClass').each(function() {
  // Note that, confusingly, jQuery's filter pseudos are 0-indexed
  // while CSS :nth-child() is 1-indexed
  $('tr.row:even').addClass('odd');
});

С соответствующим CSS:

table.myClass tr.row.odd {
  ...
}

Если вы используете автоматические инструменты тестирования, такие как Selenium или обрабатываете HTML с помощью таких инструментов, как lxml, многие из этих инструментов позволяют XPath в качестве альтернативы:

//table[contains(concat(' ', @class, ' '), ' myClass ')]//tr[contains(concat(' ', @class, ' '), ' row ')][position() mod 2)=1]

Другие решения, использующие разные технологии, оставил в качестве упражнения читателю; это всего лишь краткий, надуманный пример для иллюстрации.


Для чего это стоит, есть предложение для расширения к :nth-child() нотации , которое должно быть добавлено к Селекторы уровня 4 для конкретной цели выбора каждого n-го дочернего элемента, соответствующего данному селектору.2

Селектор, в котором для фильтрации совпадений предоставляется в качестве аргумента :nth-child(), снова из-за того, как селектора работают независимо от друг друга в последовательности, продиктованной существующим синтаксисом селектора. Итак, в вашем случае это будет выглядеть так:

table.myClass tr:nth-child(odd of .row)

(Проницательный читатель сразу заметит, что это должно быть :nth-child(odd of tr.row) вместо этого, поскольку простые селектор tr и :nth-child() работают независимо друг от друга. Это одна из проблем с функциональными псевдоклассами, которые принимают селекторы, банку червей, которую я предпочитаю не открывать посреди этого ответа. Вместо этого я собираюсь перейти к предположению что большинство сайтов не будут иметь каких-либо других элементов, кроме элементов tr, как братьев и сестер друг друга в теле таблицы, что сделает любой вариант функционально эквивалентным.)

Конечно, будучи новым предложением в новая спецификация, это, вероятно, не увидит реализацию до нескольких лет в будущем. В то же время вам придется придерживаться сценария, как указано выше.


1 Если вы укажете тип или универсальный селектор, он должен быть первым. Однако это не меняет того, как работают селекторы. это не что иное, как синтаксический приступ.

2 Первоначально это было предложено как :nth-match(), однако, поскольку оно по-прежнему считает элемент относительным только для его братьев и сестер, а не для каждого другого элемента, который соответствует данному селектору, он с тех пор, как с 2014 года был перепрофилирован как расширение существующего :nth-child().

196
задан jnic 9 July 2012 в 15:06
поделиться

10 ответов

Наконец, я ответил на свой вопрос:

Пользовательский интерфейс извлечения (то есть режим полноэкранного редактирования) может быть отключен в тот момент, когда подключено входное соединение:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {

    outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI;

    // etc.
}
152
ответ дан jnic 18 August 2018 в 23:13
поделиться
  • 1
    просто добавьте в свой XML-файл android: imeOptions = & quot; flagNoExtractUi & quot; – user 27 April 2011 в 05:28
  • 2
    jnic, где вы это сделали, переопределив в программном коде клавиатуры? SoftKeyboard.java? Я попробовал такое же переопределение и ошибку. – user 27 April 2011 в 06:08
  • 3
    Вероятно, вы захотите добавить флаг к параметрам вместо того, чтобы переопределять все параметры, которые были переданы следующим образом: outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI; – ObsidianX 4 December 2012 в 02:31
  • 4
    @ user726518 как применить этот атрибут в элементе поиска в панели действий? – Menna-Allah Sami 15 May 2014 в 14:27
  • 5
    Единственное, что срабатывало при использовании пользовательского представления для обработки клавиатуры. Благодаря! – Herman 27 March 2017 в 20:12

Ответ выше помог мне разобраться с решением для динамически добавленных EditTexts:

editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
47
ответ дан Abdo 18 August 2018 в 23:13
поделиться

Я знаю, что это немного поздно, но для тех, кто все еще интересуется, вот мое решение: в моем случае у меня была ландшафтная активность, содержащая EditText наверху, и мне нужно было реализовать функцию автозаполнения в этой операции поиска, которая перекрывала клавиатуру, вызвала проблему, которую пользователь не смог увидеть в результате работы RecyclerView. Итак, у меня был этот EditText в моем макете:

<EditText
  android:layout_width="match_parent"
  android:layout_height="?actionBarSize"
  android:id="@+id/main_search_et"
  android:imeOptions="actionSearch|flagNoExtractUi"
  android:inputType="text"  />

Приветствия!

3
ответ дан Arefeh Iravanchi 18 August 2018 в 23:13
поделиться

Вы можете вызвать, чтобы скрыть мягкую клавиатуру и очистить фокус от searchview.

public void hideKeyboard(View view) {
    InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

super.clearFocus();
0
ответ дан Eduard Malakhov 18 August 2018 в 23:13
поделиться

Кроме того, если вы хотите объединить несколько программных модулей imeOptions, вы можете использовать | синтаксис.

Например, чтобы отключить полноэкранное редактирование в ландшафте и заменить клавишу «Далее» на «ОК» (ACTION_DONE) на клавиатуре, вы можете использовать:

editText.setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
11
ответ дан Maxime Ancelin 18 August 2018 в 23:13
поделиться

добавьте свойство android:imeOptions="flagNoExtractUi" к каждому EditText в вашем файле XML.

57
ответ дан Michael Yaworski 18 August 2018 в 23:13
поделиться
  • 1
    Этот ответ слишком короткий и не соответствует стандартам качества SO. Пожалуйста, улучшите его, добавив дополнительные пояснения, чтобы он был полезен для сообщества, а не только для OP. – Lorenzo Donati 4 November 2013 в 00:16
  • 2
    @LorenzoDonati - это именно то, что вам нужно сделать ... это очень простой ответ, потому что решение очень простое, и это просто другой способ сделать это, чем ответы выше. Кроме того, ответы не могут быть «слишком короткими». если они не ответят на вопрос, ИМО. – Michael Yaworski 4 November 2013 в 00:19
  • 3
    Извините, но это не то, о чем сообщество SO думает об этом. Ответы не должны ограничиваться решением проблемы ОП, они должны быть отличными ответами в целом. Например, это и это . – Lorenzo Donati 4 November 2013 в 00:26
  • 4
    @LorenzoDonati - это конкретный вопрос very с единственным конечным результатом (но несколькими способами его решения). Мой ответ является дополнением к другим ответам на этой странице. ALL ответов на этой странице ограничивается только «проблемой OP», потому что это единственный ответ, который можно написать. Как я уже сказал, это конкретный и простой. – Michael Yaworski 4 November 2013 в 00:38
  • 5
    наконец, я нашел ответ. большое спасибо @mike yaworski – Drx 29 April 2014 в 06:54

Для этого просто перейдите к действию xml и вставьте android:imeOptions="flagNoExtractUi" в свой код. Хм довольно просто - но где hac его нужно вставить? Посмотрите на код примера activity xml и посмотрите на EditText:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"         
    >

    <EditText
        android:imeOptions="flagNoExtractUi"
        android:id="@+id/etTextInAct"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >   
        <requestFocus />
    </EditText>

</LinearLayout>

Если вы хотите больше настроек для клавиатуры, см. http://developer.android.com/guide/topics/ UI / управления / text.html

85
ответ дан pbaranski 18 August 2018 в 23:13
поделиться

Для достижения этой функции используйте android:imeOptions="flagNoFullscreen".

33
ответ дан ridoy 18 August 2018 в 23:13
поделиться
  • 1
    хороший и лучший подход к написанию в xml. Работает на меня. благодаря – Ahesanali Momin 26 April 2016 в 05:44
  • 2
    этот ответ работает только .. не идут другие .. – Ranjith Kumar 9 December 2016 в 12:46

Если вы изменяете IME напрямую, вы можете помешать ему когда-либо отображать ExtractedView, переопределив onUpdateExtractingVisibility :

@Override
public void onUpdateExtractingVisibility(EditorInfo ei) {
    ei.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
    super.onUpdateExtractingVisibility(ei);
}
9
ответ дан Suragch 18 August 2018 в 23:13
поделиться

Вы можете использовать:

android:imeOptions="flagNoFullscreen" 

в своем edittext

1
ответ дан Thientvse 18 August 2018 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: