覆盖主页和后退button是一个布尔值为true的情况

我想知道如果我可以重写后面的操作和主页button是一些情况。 通常这些button应该像他们总是这样做,但在一些情况下,我想覆盖button,让他们调用我自己的方法。

我正在使用这两种方法来覆盖这些button:

@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 } 

我想知道如果我可以重写后面的操作和主页button是一些情况。

是的,你可以重写Homebutton。

我已经开发了一个应用程序,禁用硬button,你可以看看。 我已经采取了一个切换button ,locking除了电源button之外的所有硬button的工作

 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> 

你可以调用super.onBackPressed()来调用普通的方法。 例如:

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

你不能。 你可以做的是去遍历该方法并pipe理其内部的布尔值:

例如:

  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" } 

关于重写Home Button的行为, 你是不幸的 。

但是,如果您的应用程序是特定的应用程序,并且具有有限的目标受众,如组织间应用程序,医院信息亭,餐馆订购,则可以尝试将您的应用程序设置为主页(启动器应用程序)。 你可以在这里find一个很好的例子: 如何在Android中编写自定义启动器应用程序

为了覆盖后面的关键事件,很多例子都在那里。

例如:

  1. 用android抓住按键
  2. 覆盖后退button,就像主页button一样
  3. Android的 – 如何覆盖“后退”button,所以它不完成()我的活动?

使你的布尔variables成员variables

 boolean temp; @Override public void onBackPressed() { // call my backbutton pressed method when boolean==true if(temp) //your methode else finish(); } 

我使用这个:

 public void onBackPressed() { switch (screen) { case 1: screen = 99; setContentView(R.layout.menu); break; case 99: finish(); break; } return; } 

当我在另一个屏幕(其他菜单屏幕)时,我将variables屏幕设置为1.当我按下后退button时,它将返回到菜单屏幕(而不是杀死应用程序)。 并给屏幕variables的数字99,然后当你再次点击后退button,它杀死了应用程序。

但是,您不能更改主页button。