2012-01-14 2 views
10

У меня есть некоторые намерения внутри контроллера табуляции, и для одного из них у меня есть текст редактирования, который мне нужно знать наверняка, когда он имеет фокус, и когда он теряет этот фокус. Я отобразил большинство событий, таких как прослушиватель фокуса, OnEditorActionListener и т. Д. Теперь моя единственная проблема заключается в том, что когда у меня есть фокус, появляется мягкая клавиатура, и я хочу ее закрыть: 1) кнопкой done, а не по кнопке «Назад» на телефоне (отключите кнопку «Назад», чтобы закрыть клавиатуру, когда клавиатура видна) 2) обнаружение события кнопки «Назад», когда клавиатура видна, чтобы я мог передать фокус другому элементу управления.Обнаружение обратного события на клавиатуре Android

Я пробовал несколько способов, но без успеха, например onBackPressed, onConfigurationChanged (добавить hiddenKeyboard в манифесте), key_down по активности и т. Д., Но не удался.

Неужели кто-нибудь преуспел в этом? Практически я хочу, когда клавиатура видна, и я нажимаю на телефон, мой текст редактирования теряет фокус (otherControl.requestFocus ->, который является относительным расположением).

+0

показать мне, что вы пробовали до сих пор – confucius

+0

1. это один txtSearchBar .setOnEditorActionListener (новый EditText.OnEditorActionListener() \t {\t \t public boolean onEditorAction (T extView v, Int ActionId, KeyEvent событие) \t { \t, если (event.getKeyCode() == KEYCODE_BACK) \t { \t \t layoutFocus.requestFocus(); \t \t \t \t} \t return false; \t} \t}); 2. метод 2 on onBackPressed, layoutFocus.requestFocus(); 3.добавить hiddenKeyboard в манифесте для этой деятельности и положить \t @Override \t общественного недействительными onConfigurationChanged (Конфигурация newConfig) – Catalin

+0

Невозможно добавить больше кода, поскольку я не могу ответить на мой вопрос, если у меня есть более чем 100 очков репутации :) – Catalin

ответ

2

здесь

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
     if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) 
    { //do you back event work here 
      }  
    return super.dispatchKeyEvent(event); 
} 
+2

Спасибо за код, но он не работает, к сожалению :(Используя ваш метод, обратный ключ попадает в ловушку только тогда, когда мягкая клавиатура уже скрыта (после того, как я нажал кнопку «Готово»), а затем она выходит из программы. клавиатура отображается, и я нажимаю на нее назад, она выполняет скрытие клавиатуры, но не проходит этот метод. Я тестирую на Android 2.2 и 2.3 – Catalin

+0

Да, потому что, когда вы нажимаете назад и клавиатура встает, , и он возвращается, вы можете прослушивать событие тогда и только тогда, когда пользователь нажимает на вашу активность, в этом случае активность клавиатуры прослушивает это событие назад. – AAnkit

+0

Любой способ отслеживать обратную активность клавиатуры или любой способ отключить кнопка назад для работы во время клавиатуры вверх? Что-то вроде подклассификации текста редактирования и изменения некоторых вещей? Возможно ли это? – Catalin

9

Старая тема, но вот ожидаемый ответ

@Override 
public boolean onKeyPreIme(int keyCode, KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { 
     Toast.makeText(getContext(), "BACK", Toast.LENGTH_SHORT).show(); 
     return true; 
    } 
    return super.onKeyPreIme(keyCode, event); 
} 

Вы должны поместить это в классе, который переопределяет EditText (класс MyEditText расширяет EditText ...)

3

Вот как сделать снимок нажатием ключевого события: 1. Экстентное редактирование текста для переопределения onKeyPreIme

package com.test.test; 
import android.content.Context; 
import android.util.AttributeSet; 
import android.view.KeyEvent; 
import android.widget.EditText; 

/** 
* Created by sumit.saurabh on 11/10/16. 
*/ 

public class ChatEditText extends EditText 
{ 
    /* Must use this constructor in order for the layout files to instantiate the class properly */ 
    public ChatEditText(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     // TODO Auto-generated constructor stub 
    } 

    private KeyImeChange keyImeChangeListener; 

    public void setKeyImeChangeListener(KeyImeChange listener) 
    { 
     keyImeChangeListener = listener; 
    } 

    public interface KeyImeChange 
    { 
     public void onKeyIme(int keyCode, KeyEvent event); 
    } 

    @Override 
    public boolean onKeyPreIme(int keyCode, KeyEvent event) 
    { 
     if (keyImeChangeListener != null) 
     { 
      keyImeChangeListener.onKeyIme(keyCode, event); 
     } 
     return false; 
    } 
} 

2. ChatEditText в XML

<com.test.test.ChatEditText 
    android:id = "@+id/messageEditText" 
    android:layout_width = "match_parent" 
    android:layout_height = "wrap_content" 
    android:layout_gravity = "bottom" 
    android:layout_marginLeft = "12dp" 
    android:layout_marginRight = "30dp" 
    android:background = "@null" 
    android:hint = "Type your message" 
    android:inputType = "textMultiLine" 
    android:singleLine = "false" 
    android:textColorHint = "#c4c0bd" 
    android:textSize = "18sp"/> 

3. Затем присоедините слушателя из любого места, как так:

private ChatEditText messageEditText; 
    messageEditText = 
     (ChatEditText) findViewById(R.id.messageEditText); 
messageEditText.setKeyImeChangeListener(new ChatEditText.KeyImeChange(){ 
    @Override 
    public void onKeyIme(int keyCode, KeyEvent event) 
    { 
     if (KeyEvent.KEYCODE_BACK == event.getKeyCode()) 
     { 
      // do something 
     } 
    }}); 
Смежные вопросы