【问题标题】:Android TabHost - catch back buttonAndroid TabHost - 后退按钮
【发布时间】:2013-05-06 19:12:58
【问题描述】:

我有一个使用 TabHost 的 Android 应用程序,根据所选选项卡调用其他活动的活动简称为 Main.java。我试图覆盖 Main.java 类中的后退按钮事件,但它似乎没有看到它。我正在尝试显示一个对话框窗口并与用户确认他们想要退出,如果他们点击确定让它完全关闭应用程序(不仅仅是发送到后台),如果他们点击取消,显然让它保持打开状态。关于为什么这似乎不起作用的任何建议?

@Override
public void onBackPressed() 
{               
     AlertDialog.Builder alert = new AlertDialog.Builder(getApplicationContext());
     alert.setMessage("Test dialog");
     alert.show();
}

【问题讨论】:

  • Main.java 是 Activity 吗?
  • 请不要像那样覆盖后退按钮。这不是 Android 上的标准行为,因此永远不应该实现。如果您决定实施它,您的用户将吃早餐。相反,如果您需要注销用户,请在应用关闭时将其注销。
  • Main 是具有 tabHost 的活动,但是当用户单击不同的选项卡时,它会在该活动的选项卡内容内启动一个新意图。因此,例如,如果他们单击 Status,它将启动 Status 活动,但在 Main.java 的 tabcontent 中。我很欣赏您的 Darwind 输入,但我需要一个确认对话框来验证用户是否要退出。
  • 小心弄乱标准的 Android 应用程序行为......即覆盖后退按钮或任务管理,用户会感到困惑。在您的主要任务上放一个大的 LOGOUT 按钮,让它在一段时间后自动注销,等等,但不要更改 Back 按钮。
  • 明白了,我会按照 Darwind 的建议在应用关闭时考虑让用户退出。

标签: android dialog android-tabhost back confirm


【解决方案1】:

事实证明这很容易。将以下代码添加到您的子选项卡活动:

@Override
public void onBackPressed() {
this.getParent().onBackPressed();   
}

然后在TabActivity中做真正的逻辑:

 @Override
public void onBackPressed() {
// Called by children
 AlertDialog.Builder alert = new AlertDialog.Builder(getApplicationContext());
 alert.setMessage("Test dialog");
 alert.show();
}

否则,孩子会在不通知标签宿主的情况下拦截并消费事件。

【讨论】:

    【解决方案2】:

    我知道这很晚了,但它仍然可以帮助某人

    请将以下代码添加到托管其他活动的 TabActivity 中,并将代码添加到与 Tabhost 一起托管的每个子活动中。它对我有用。

    @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)  {
            if (android.os.Build.VERSION.SDK_INT > 5
                    && keyCode == KeyEvent.KEYCODE_BACK
                    && event.getRepeatCount() == 0) {
                Log.d("CDA", "onKeyDown Called");
                onBackPressed();
                return true; 
            }
            return super.onKeyDown(keyCode, event);
        }
    
        @Override
        public void onBackPressed() {
           Log.d("CDA", "onBackPressed Called");
           Intent setIntent = new Intent(Intent.ACTION_MAIN);
           setIntent.addCategory(Intent.CATEGORY_HOME);
           setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
           startActivity(setIntent);
        }
    

    祝你好运。

    【讨论】:

      【解决方案3】:
      Hi All below is my solution for this question -
      
      //////---------------------------/////////////
      
      FragmentManager mFragmentManager = getSupportFragmentManager();
      
      @Override
      public void onBackPressed() {
      
          if (getParent() instanceof TabHostActivity) {
              int count = mFragmentManager.getBackStackEntryCount();
              if(count == 0){
                  // TODO: Call your exist alert
              }
              else{
                   super.onBackPressed();  
              }
          }
          else{
               super.onBackPressed();  
          }
      }
      
      
      //////---------------------------/////////////
      

      【讨论】:

        猜你喜欢
        • 2012-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-21
        • 2011-08-28
        • 2013-04-22
        • 1970-01-01
        相关资源
        最近更新 更多