2015-01-08 1 views
0

Как скрыть ввод мягкой клавиатуры, пока я использую ScrollView в моем LinearLayout?Как скрыть ввод мягкой клавиатуры при использовании ScrollView

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

(1)

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); 
    return true; 
} 

(2)

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
    ScrollView myScrollView = (ScrollView) findViewById(R.id.scrollview); //of course scrollview was id in layout then 
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); 
    return true; 
} 

(3)

То же, что и # 2, но с LinearLayout вместо ScrollView.


Ни одно из этих трех решений не сработало для меня.

Одна вещь, которую я заметил, заключается в том, что когда я удаляю ScrollView из файла layout.xml, все работает по назначению.

+0

Вы уверены, что событие вызвано? все кажется нормальным –

+0

@RobinDijkhof Да. Я использовал '@Override public boolean onTouchEvent (событие MotionEvent) { InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow (getCurrentFocus(). GetWindowToken(), 0); return true; } Функция в моих предыдущих действиях и все работает нормально.По моему мнению, есть некоторые проблемы с компонентом ScrollView (но я точно не знаю, что) beacause, как я уже сказал, когда добавлял комментарий в компонент ScrollView в макете xml-файла (res/layout-port), все было в порядке. – Tom

ответ

0

ScrollView, вероятно, поглощает событие касания. Может быть, попробуйте подключить onFocusChangeListener вашего вида прокрутки и скрывать клавиатуру оттуда?

scrollView.setOnFocusChangeListener(new OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if(hasFocus) { 
      hideKeyboard(); 
     } 
    } 
}); 

Возможно, вам потребуется добавить некоторые атрибуты в прокрутку в xml.

android:focusable="true" 
android:focusableInTouchMode="true" 
+0

Я положил после метода onCreate в текущей активности ваш код и добавил log.w, чтобы проверить, вызван ли метод. Я ничего не видел в отладчике, поэтому метод никогда не вызывался после того, как я коснулся экрана. – Tom

0
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    LinearLayout layout = (LinearLayout) findViewById(R.id.linear_layout_id_root); 
    setHideKeyboard(this, layout); 
} 

public void setHideKeyboard(final Context context, View view) { 
    try { 
     //Set up touch listener for non-text box views to hide keyboard. 
     if (!(view instanceof EditText || view instanceof ScrollView)) { 

      view.setOnTouchListener(new View.OnTouchListener() { 

       public boolean onTouch(View v, MotionEvent event) { 
        InputMethodManager in = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 
        in.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 
        return false; 
       } 

      }); 
     } 

     //If a layout container, iterate over children and seed recursion. 
     if (view instanceof ViewGroup) { 

      for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 

       View innerView = ((ViewGroup) view).getChildAt(i); 

       setHideKeyboard(context, innerView); 
      } 
     } 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 
0

Во-первых, расширить EditText и добавить фрагмент кода, который помогает закрыть клавиатуру каждый раз, когда экземпляры EditText теряют фокус

public class MyEditText extends AppCompatEditText { 

public MyEditText(Context context) { 
    super(context); 
    setupEditText(); 
} 

public MyEditText(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    setupEditText(); 
} 

public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    setupEditText(); 
} 

public void setupEditText() { 
    // Any time edit text instances lose their focus, dismiss the keyboard! 
    setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (!hasFocus && !(findFocus() instanceof MyEditText)) { 
       hideKeyboard(v); 
      } else { 
       showKeyboard(v); 
      } 
     } 
    }); 
} 

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

public void showKeyboard(View view) { 
    InputMethodManager inputMethodManager = (InputMethodManager) getContext().getSystemService(Activity.INPUT_METHOD_SERVICE); 
    inputMethodManager.showSoftInput(view, 0); 
} 
} 

Затем установите android:clickable="true" и android:focusableInTouchMode="true" в ребенка макет вашего ScrollView!

Обратите внимание: это должно быть дочернее расположение ScrollView, а не ScrollView.

<ScrollView 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:clickable="true" 
    android:focusableInTouchMode="true" 
    android:orientation="vertical"> 

    <MyEditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 
    </MyEditText> 

</LinearLayout> 

</ScrollView> 

Это должно сработать!

1

В моем случае, я генерации динамической формы, которая состоит слишком много полей EditText внутри Scrollview и, чтобы скрыть клавиатуру прокруткой форму я попытался слишком много вариантов, но, наконец, удалось зафиксировать, используя код ниже:

scrollView.setOnTouchListener(new View.OnTouchListener() 
{ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     if (event != null && event.getAction() == MotionEvent.ACTION_MOVE) 
     { 
      InputMethodManager imm = ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)); 
      boolean isKeyboardUp = imm.isAcceptingText(); 

      if (isKeyboardUp) 
      { 
       imm.hideSoftInputFromWindow(v.getWindowToken(), 0); 
      } 
     } 
     return false; 
    } 
});