2012-04-05 4 views
10

Mi chiedevo se è possibile ignorare l'azione del pulsante back e home in alcuni casi. Normalmente questi pulsanti dovrebbero reagire come sempre, ma in un caso alcune impostazioni sono vere, voglio sovrascrivere i pulsanti e lasciare che chiamino i miei metodi.Ignora il pulsante home e back è il caso in cui un boolean è vero

sto utilizzando questi due metodi per ignorare questi pulsanti:

@Override 
    public void onBackPressed() {  
    // call my backbutton pressed method when boolean==true 
    } 

    @Override 
    public void onAttachedToWindow() {                      this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);  
    super.onAttachedToWindow(); 
    // call my homebutton pressed method when boolean==true 
    } 

risposta

41

Mi chiedevo se è possibile ignorare l'azione del pulsante Indietro e Home in alcuni casi.

Sì, è possibile eseguire l'override del pulsante Home.

Ho sviluppato un'applicazione che disabilita il pulsante duro, puoi dare un'occhiata. io ho preso un pulsante di commutazione che blocca tutto il pulsante difficile lavorare tranne Potenza pulsante

public class DisableHardButton extends Activity { 
    /** Called when the activity is first created. */ 
    TextView mTextView; 
    ToggleButton mToggleButton; 
    boolean isLock=false; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mTextView=(TextView) findViewById(R.id.tvInfo); 
     mToggleButton=(ToggleButton) findViewById(R.id.btnLock); 


     mToggleButton.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      // TODO Auto-generated method stub 
      isLock=isChecked; 
      onAttachedToWindow(); 
     } 
    }); 
    } 
@Override 
    public boolean dispatchKeyEvent(KeyEvent event) { 

     if ((event.getKeyCode() == KeyEvent.KEYCODE_HOME) && isLock) { 
      mTextView.setText("KEYCODE_HOME"); 
      return true; 
     } 
     else 
      return super.dispatchKeyEvent(event); 
    } 
@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     // TODO Auto-generated method stub 

     if((keyCode==KeyEvent.KEYCODE_BACK) && isLock) 
     { 
      mTextView.setText("KEYCODE_BACK"); 
      return true; 
     } 
      else 
      return super.onKeyDown(keyCode, event); 
    } 
@Override 
    public void onAttachedToWindow() 
    { 
     System.out.println("Onactivity attached :"+isLock); 
     if(isLock) 
     { 
      this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);  
      super.onAttachedToWindow(); 
     } 
     else 
     { 
      this.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION);  
      super.onAttachedToWindow(); 
     } 
    } 
} 

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/tvInfo" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" /> 

    <ToggleButton 
     android:id="@+id/btnLock" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textOff="UnLocked" 
     android:textOn="Locked" /> 

</LinearLayout> 
+1

Wow, questo è grande, esattamente ciò che sto cercando ! – Diego

+1

Non lo sapevo, pensavo che non potessi cambiarlo, +1 :) – Bigflow

+1

Ottimo! il suo funzionamento perfectoo. – Dharmendra

3

No non si può. Che cosa si può fare è quello di ovveride il metodo e gestire il booleano al suo interno:

per esempio:

public void onBackPressed() { // call my backbutton pressed method when boolean==true 

     if (myCondition) { 
      // take care of my needs 
     } else 
      // call super to let the back behavior be "normal" 

    } 
1

rendere la variabile membro variabile booleana

boolean temp; 

@Override 
     public void onBackPressed() { // call my backbutton pressed method when boolean==true 

if(temp) 
//your methode 
else 
finish(); 
      } 
2

Per quanto riguarda l'override del comportamento del tasto domestico you are out of luck.

Tuttavia, se l'app è specifica e ha un pubblico limitato, come l'app inter-organizzazione, il chiosco ospedaliero, l'ordine del ristorante, puoi provare a creare l'app come Home (l'app di avvio). Puoi trovare un buon esempio qui: How to Write Custom Launcher App in Android

E per ignorare gli eventi del tasto Indietro, ci sono molti esempi.

Ad esempio:

  1. Catch keypress with android
  2. Override back button to act like home button
  3. Android - How To Override the "Back" button so it doesn't Finish() my Activity?
4

Si chiama super.onBackPressed() per chiamare il metodo normale. Esempio:

@Override 
public void onBackPressed() {  
    if (activated) { 
     //doyourthing 
    } else { 
     super.onBackPressed() 
    } 
} 
1

Io uso questo:

public void onBackPressed() { 

     switch (screen) { 
     case 1: 
      screen = 99; 
      setContentView(R.layout.menu); 
      break; 

     case 99: 
      finish(); 
      break; 

     } 
     return; 
    } 

Quando mi trovo in un altro schermo (altro schermo menu, quindi), ho impostato la schermata variabile 1. Quando si preme il pulsante Indietro , torna alla schermata del menu (invece di uccidere l'app). e dai alla variabile dello schermo il numero 99, poi quando premi nuovamente il pulsante Indietro, uccide l'app.

Tuttavia, non è possibile modificare il pulsante Home.