tactiles - manual de programacion android pdf
Detectando tecla de menú física presiona en Android (6)
Intento detectar cuando se ha presionado el botón de menú físico en mi teléfono Android. Pensé que el código siguiente funcionaría, pero no es así. ¿Dónde me estoy equivocando, por favor?
El error devuelto es ''Modificador ilegal para el parámetro onKeyDown; solo final está permitido ''
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
// Do Stuff
} else {
return super.onKeyDown(keyCode, event);
}
}
Asegúrate de anular el método onKeyDown en tu clase de actividad. Hay otro método onKeyDown en la clase View pero no se llamará si se presiona la tecla de menú.
En función de todo lo anterior, esta parece ser la implementación correcta que consumirá únicamente los eventos "arriba" de la tecla de menú y transmitirá otros eventos clave a la superclase.
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
// ...
return true;
} else {
return super.onKeyUp(keyCode, event);
}
}
Si manejaste el evento simplemente devuelve true, si no devolviste false para que el sistema Android pueda pasar el evento al resto de los componentes para manejarlo.
Tengo una respuesta muy buena de esta pregunta :) He intentado por 1 año pasado jajaja y acabo de encontrar la solución 3 días antes. Mire la respuesta. Necesitas hacer una clase de septate de vigilante de hogar. Utilice exactamente el siguiente código con el nombre de HomeWatcher.
public class HomeWatcher {
static final String TAG = "HomeWatcher";
private Context mContext;
private IntentFilter mFilter;
private OnHomePressedListener mListener;
private InnerRecevier mRecevier;
public interface OnHomePressedListener {
public void onHomePressed();
public void onHomeLongPressed();
//public void onLockLongPressed();
}
public HomeWatcher(Context context) {
mContext = context;
mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
}
public void setOnHomePressedListener(OnHomePressedListener listener) {
mListener = listener;
mRecevier = new InnerRecevier();
}
public void startWatch() {
try{
if (mRecevier != null) {
mContext.registerReceiver(mRecevier, mFilter);
}
}catch(Exception e){}
}
public void stopWatch() {
try{
if (mRecevier != null) {
mContext.unregisterReceiver(mRecevier);
}
}catch(Exception e){}
}
class InnerRecevier extends BroadcastReceiver {
final String SYSTEM_DIALOG_REASON_KEY = "reason";
final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
//final String SYSTEM_DIALOG_REASON_Lock = "lock";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
if (reason != null) {
Log.e(TAG, "action:" + action + ",reason:" + reason);
if (mListener != null) {
if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
mListener.onHomePressed();
} else if (reason
.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
mListener.onHomeLongPressed();
}
/* else if (reason
.equals(SYSTEM_DIALOG_REASON_Lock)) {
mListener.onLockLongPressed();
}*/
}
}
}
}
}
}
Después de hacer la clase HomeWatcher. Debe declarar Homewatcher en la clase deseada en la que desea detectar el botón de inicio y el botón de Aplicaciones recientes.
public class MainActivity extends Activity {
private HomeWatcher mHomeWatcher;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
mHomeWatcher = new HomeWatcher(this);
mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {
@Override
public void onHomePressed() {
Log.e(TAG, "onHomePressed");
}
@Override
public void onHomeLongPressed() {
Log.e(TAG, "recent apps");
}
});
mHomeWatcher.startWatch();
} catch (Exception e) {
}
}
Al final de esto solo necesitas agregar el método onPause y onResume Overide como este.
@Override
protected void onResume() {
super.onResume();
try {
mHomeWatcher.startWatch();
} catch (Exception e) {
}
}
@Override
protected void onPause() {
super.onPause();
try {
mHomeWatcher.stopWatch();
} catch (Exception e) {
}
}
Una respuesta muy simple y hermosa. Esperando los votos y la respuesta aceptada: p
onKeyUp
un evento clave arriba , en lugar de un evento inactivo , con onKeyUp
.
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
// ........
return true;
}
return super.onKeyUp(keyCode, event);
}
Devolvemos la true
porque estamos manejando el evento; devuelve false
si quieres que el sistema maneje el evento también.
También puede hacer todo esto en su instancia de Activity
porque Activity
es una subclase indirecta conocida de KeyEvent
.
public boolean onKeyDown(int keyCode, KeyEvent event) {
//Checking for the "menu" key
if (keyCode == KeyEvent.KEYCODE_MENU) {
if (mDrawerLayout.isDrawerOpen(mDrawerList)) {
mDrawerLayout.closeDrawers();
} else {
mDrawerLayout.openDrawer(Gravity.RIGHT);
}
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}