Проблема заключается в том, что значок ActionBarDrawerToggle
установлен в качестве кнопки навигации на Toolbar
. Эта кнопка представляет собой специальный дочерний элемент Toolbar
, который будет иметь приоритет в макете. Каждому другому дочернему View
s, добавленному в Toolbar
, будет выделено только пространство, оставшееся после этого ImageButton
. Это толкает левую сторону вашего RelativeLayout
вправо, так что TextView
s, в котором вы сосредоточены, не будет центрироваться относительно самого Toolbar
.
К счастью, Toolbar
LayoutParams
имеет свойство гравитации, которое мы можем использовать для центрирования LinearLayout
и его TextView
s непосредственно в Toolbar
, без необходимости их обертывания в другой ViewGroup
.
В этом примере мы применяем эту гравитацию центра, установив LinearLayout
layout_gravity
на center
. Не забудьте также изменить значения layout_width
на wrap_content
, или вы будете в той же лодке, что и раньше. Здесь ImageView
имеет layout_gravity
значение right|center_vertical
, заменяя те layout_*
атрибуты, специфичные для RelativeLayout
.
Нарезка не ограничена - проверяется встроенными типами. И хотя оба ваших примера, похоже, имеют одинаковый результат, они работают по-другому; попробуйте их со списком.
Для добавления ответа, который указывает на надежный раздел в документации :
Учитывая выражение среза, подобное s[i:j:k]
,
Срез s от i до j с шагом k определяется как последовательность элементов с индексом x = i + n * k, такая, что 0 & lt; = n & lt; (J-я) / к. Другими словами, индексы i, i + k, i + 2 * k, i + 3 * k и т. Д., Останавливаясь, когда j достигнуто (но никогда не включает j). Когда k положительно, i и j сведены к len (s), если они больше
blockquote>, если вы пишете
s[999:9999]
, python возвращаетs[len(s):len(s)]
сlen(s) < 999
и ваш шаг (1
- значение по умолчанию).
k
положителен, i
и j
также увеличиваются до -len(s)
, когда они меньше? например s = 'bac'; s[-100:2] == s[-len(s):2]
– Chris_Rands
4 July 2017 в 12:56
k
положителен, Python будет масштабировать i
и j
так, чтобы они соответствовали границам последовательности. Например, в вашем примере s[-100:2] == s[0:2]
(== s[-len(s):2]
). Аналогично s[-100:100] == s[0:2]
.
– tylerc0816
18 August 2017 в 13:26
Вы в основном ответили на свой вопрос. Нарезка за пределами последовательности (по крайней мере для встроенных) не вызывает ошибки. Это имеет смысл, когда вы об этом думаете. Индексирование возвращает один элемент, но нарезка возвращает подпоследовательность элементов. Поэтому, когда вы пытаетесь индексировать несуществующее значение, ничего не вернуть; но когда вы вырезаете последовательность за пределами границ, вы все равно можете вернуть пустую последовательность.
Также обратите внимание, что есть различие между x[3]
и x[3:4]
. Например:
>>> [0, 1, 2, 3, 4, 5][3]
3
>>> [0, 1, 2, 3, 4, 5][3:4]
[3]
Причина, по которой они выглядят одинаково в случае строк, заключается в том, что не существует такой вещи, как отдельный символ за пределами строки; один символ - это всего лишь 1-символьная строка.
None
вместо ошибки - это обычное соглашение Python, когда вам нечего возвращать.
– Mark Ransom
29 February 2012 в 00:30
None
в этом случае будет сложнее рассказать между индексом вне пределов и значением None
внутри списка. Но даже если для этого было обходным путем, мне остается ясным, что возвращение пустой последовательности - это правильная вещь, когда нужно давать срезанный срез. Это аналогично выполнению объединения двух непересекающихся множеств.
– senderle
29 February 2012 в 00:49
None
в списке.
– Mark Ransom
29 February 2012 в 00:53