【问题标题】:Override home and back button is case a boolean is true覆盖主页和后退按钮是布尔值为真的情况
【发布时间】:2012-04-19 00:27:54
【问题描述】:

我想知道在某些情况下是否可以覆盖返回和主页按钮的操作。通常这些按钮应该像往常一样做出反应,但在某些设置为真的情况下,我想覆盖按钮并让它们调用我自己的方法。

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

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

【问题讨论】:

    标签: android button overriding back-button


    【解决方案1】:

    我想知道在某些情况下是否可以覆盖返回和主页按钮的操作。

    是的,您可以覆盖 Home 按钮。

    我开发了一个禁用硬按钮的应用程序,你可以看看。 我使用了一个切换按钮,它可以锁定除电源按钮之外的所有硬按钮

    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 :)
    • IIRC 这种覆盖主页按钮的方式幸运的是在 Android 4.0 中不再有效
    • 是的,幸运的是,这种方法不适用于 Android 4.0.3。
    • @CommonsWare 我将 android:launchMode="singleInstance" android:stateNotNeeded="true" 添加到应该显示的活动中,因此当单击主页时,我会得到一个选择框可供选择。这是让它工作的唯一方法,先生?
    【解决方案2】:

    你调用 super.onBackPressed() 来调用普通方法。 示例:

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

    【讨论】:

      【解决方案3】:

      不,你不能。您可以做的是覆盖该方法并管理其中的布尔值:

      例如:

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

      【讨论】:

        【解决方案4】:

        关于覆盖主页按钮you are out of luck的行为。

        但是,如果您的应用是特定应用并且目标受众有限,例如跨组织应用、医院信息亭、餐厅订餐,您可以尝试将您的应用设为主页(启动器应用)。你可以在这里找到一个很好的例子:How to Write Custom Launcher App in Android

        为了覆盖后退键事件,有很多例子。

        例如:

        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?

        【讨论】:

          【解决方案5】:

          使你的布尔变量成员变量

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

          【讨论】:

            【解决方案6】:

            我用这个:

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

            当我在另一个屏幕(除菜单屏幕之外)时,我将变量 screen 设置为 1。 当我按下后退按钮时,它会返回菜单屏幕(而不是终止应用程序)。 并给屏幕变量数字 99,然后当你再次点击返回按钮时,它会杀死应用程序。

            但是,您不能更改主页按钮。

            【讨论】:

              猜你喜欢
              • 2011-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-12-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多