2016-02-03 2 views
2

У меня есть несколько редакторов в вертикальной линейной компоновке. Когда в фокусе, и я нажал следующую кнопку на моей клавиатуре, в идеале фокус должен перейти к следующему редактору. Но когда я регистрирую onClickListener для edittext и переопределяет метод onClick, я заметил это; нажатие следующей клавиши не фокусируется на следующем (или любом другом) редакторе.OnClick for Edittext отключает действие клавиатуры «по-умолчанию» по умолчанию.

Где и когда я не регистрирую onClickListener, фокус перемещается при нажатии следующей кнопки.

Можете ли вы объяснить, почему это так? Есть ли обходной путь?

Вот код:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="match_parent" 
    android:layout_marginTop="?attr/actionBarSize" 
    android:paddingLeft="20dp" 
    android:paddingRight="20dp" 
    android:paddingTop="20dp" 
    android:paddingBottom="20dp" 
    android:weightSum="1" 
    android:focusableInTouchMode="true"> 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_weight="1" 
     android:layout_height="0dp"> 

    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     style="@style/TblLayout"> 

     <TableRow 
      android:weightSum="10"> 
      <TextView 
       style="@style/TvTblLabel" 
       android:text="@string/str1" /> 

      <android.support.design.widget.TextInputLayout 
       android:id="@+id/il1" 
       style="@style/IlStyle"> 
       <EditText 
        android:id="@+id/et1" 
        style="@style/EditTextNumber"/> 
      </android.support.design.widget.TextInputLayout> 
     </TableRow> 

     <TableRow 
      android:weightSum="10"> 
      <TextView 
       style="@style/TvTblLabel" 
       android:text="@string/str2" /> 

      <android.support.design.widget.TextInputLayout 
       android:id="@+id/il2" 
       style="@style/IlStyle"> 
       <EditText 
        android:id="@+id/et2" 
        style="@style/EditTextNumber"/> 
      </android.support.design.widget.TextInputLayout> 
     </TableRow> 



    </TableLayout> 
    </ScrollView> 
</LinearLayout> 

Стили:

<style name="TvTblLabel" parent="@android:style/TextAppearance"> 
    <item name="android:layout_gravity">center_vertical</item> 
    <item name="android:layout_weight">6.5</item> 
    <item name="android:layout_width">0dp</item> 
    <item name="android:layout_height">wrap_content</item> 
    <!--<item name="android:paddingBottom">3dp</item>--> 
    <item name="android:paddingRight">3dp</item> 

    <!-- <item name="android:textSize">20sp</item>--> 
    <!-- <item name="android:padding">3dip</item>--> 
</style> 

<style name="IlStyle"> 
    <item name="android:layout_weight">3.5</item> 
    <item name="android:layout_width">0dp</item> 
    <item name="android:layout_height">wrap_content</item> 
</style> 

<style name="EditTextNumber" parent="@android:style/TextAppearance.Medium"> 
    <item name="android:layout_width">match_parent</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:inputType">numberDecimal</item> 
    <item name="android:selectAllOnFocus">true</item> 
    <item name="android:gravity">right</item> 
</style> 

фрагмент кода:

private void setup(){ 
et1.addTextChangedListener(new AppInputWatcher(et1)); 
et1.setOnClickListener(this); 
} 

... 

@Override 
public void onClick(View v) { 
EditText et = (EditText)v; 
et.setSelection(et.getText().toString().length()); 
} 

... 

@Override 
public void afterTextChanged(Editable s) { 
.. 
et.removeTextChangedListener(this); 
et.setText(setEtStr); 
et.setSelection(et.getText().toString().length()); 
et.addTextChangedListener(this); 
} 
+0

и ваш xml-файл? –

+0

только что столкнулся с одной и той же проблемой, не могу поверить, что вы единственная с подобной проблемой. Я считаю, что это ошибка, поэтому я сообщил об этом: https://code.google.com/p/android/issues/detail?id=221498&thanks=221498&ts=1472764240 – Singed

ответ

0

Вы должны добавить их в файл XML для EditTexts:

android:nextFocusDown="@+id/.." 
android:nextFocusLeft="@+id/.."  
android:nextFocusRight="@+id/.."  
android:nextFocusUp="@+id/.." 

Это должно сделать трюк для вас.

+0

Это не практично. Я читал об этом, но реализация по умолчанию должна работать. Попытка выяснить, в чем проблема? Удивительно, когда я удаляю onClickListener, он работает. Это подшучивает. –

1

Я думаю, что это ошибка в инфраструктуре Android. Вот обходной путь, который вы можете использовать:

Используйте setOnEditorActionListener, чтобы прослушивать события действий клавиатуры.

реализация

Слушатель может выглядеть следующим образом:

@Override 
public void onEditorAction(int actionCode) { 
    // check if "next" button is pressed 
    if (actionCode == EditorInfo.IME_ACTION_NEXT) { 
     View view = focusSearch(FOCUS_FORWARD); 
     view.requestFocus(); 
    } 
    super.onEditorAction(actionCode); 
} 

Это то, что Android обычно делает, когда нет нажмите слушатель не установлен для редактирования текста, но так как он не выполняет его, когда слушатель установлен, вы можете просто написать это самостоятельно :) Я не уверен, что FOCUS_FORWARD или FOCUS_DOWN следует использовать как параметр focusSearch, вероятно, зависит от вашего usecase. Кроме того, вы должны добавить нулевую проверку для view перед вызовом requestFocus.

Смежные вопросы