Фокус EditText несовместим во всех макетах - PullRequest
11 голосов
/ 10 мая 2011

У меня есть два разных файла main.xml, один для портрета, другой для макета.У каждого есть этот код внутри RelativeLayout внутри Scrollview.

<LinearLayout
    android:id="@+id/name_phone"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/acquire"
    >
    <EditText
        android:id="@+id/name"
        android:inputType="textPersonName"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="observer name"
        android:nextFocusDown="@id/phone"
        android:background="@android:drawable/editbox_background"               
        />
    <EditText
        android:id="@+id/phone"
        android:inputType="phone"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="phone number"
        android:nextFocusDown="@id/phone"
        android:background="@android:drawable/editbox_background"
        />
    </LinearLayout>

и т. Д.

Странность такая: насколько я знаю, вы не должны бытьвозможность ссылаться на вещи, которые еще не произошли в xml, поэтому android: nextFocusDown = "@ id / phone" должен произойти сбой, потому что телефон не был объявлен;и это то, что происходит в моем xml ландшафта, но не в портретной.В портретном режиме он работает отлично и проходит фокус через все четыре EditTexts без заминки.Если я помещу NextFocusDown в ландшафт, он не сможет скомпилироваться, сообщив: «Не найден ресурс, соответствующий данному имени (в« nextFocusDown »со значением« @ id / phone »)».

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

Ответы [ 2 ]

22 голосов
/ 24 сентября 2014

Это действительно старый пост, но я отвечаю на него как могу. Из того, что я знаю, вы ставите знак + при первом обращении к идентификатору, поэтому на вашем: android:nextFocusDown="@id/phone" на самом деле должно быть android:nextFocusDown="@+id/phone, потому что вы впервые ссылаетесь на этот объект. Затем выньте знак +, где у вас есть android:id="@+id/phone"

Надеюсь, это поможет любому, кто сталкивается с этим.

7 голосов
/ 28 мая 2011

Вы используете "@ id / phone", попробуйте использовать "@ + id / phone", знак + необходим для ссылки на идентификатор объекта

...