2013-05-06 1 views
2

У меня есть приложение для Android, которое использует TabHost, действие, которое вызывает других на основе выбранной вкладки, просто называется Main.java. Я попытался переопределить событие кнопки «Назад» внутри класса Main.java, однако, похоже, он не видит его. Я пытаюсь отобразить диалоговое окно и подтвердить с помощью пользователя, что они хотят выйти, и если они нажмут OK, полностью закройте приложение (а не просто отправьте его на задний план), и если они нажмут «Отмена», очевидно, что он останется открытым. Любые предложения относительно того, почему это не работает?Android TabHost - кнопка возврата назад

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

Is Main.java Деятельность? – eliteslayer

+0

Пожалуйста, не отменяйте эту подкладку. Это не стандартное поведение на Android и, следовательно, никогда не должно быть реализовано. У вас будет голова на завтрак, если вы решите ее реализовать. Вместо этого, если вам нужно вывести пользователя из системы, выйдите из него, когда приложение закроется. – Darwind

+0

Main - это активность, которая имеет tabHost, но когда пользователь нажимает на разные вкладки, она начинает новое намерение внутри tabcontent для этого действия. Поэтому, если они нажимают «Статус», например, он запускает операцию «Статус», но внутри содержимого табуляции в Main.java. Я appreicate ваш вход Darwind, но мне НУЖНО диалог подтверждения, чтобы проверить, что пользователь хочет выйти. – Phil

ответ

10

Это оказывается довольно легко. Добавьте следующий код для вашего ребенка вкладки деятельности:

@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(); 
} 

В противном случае, дети будут перехватывать и потреблять событие без уведомления хоста вкладки.

+0

Работаю красиво! – Phil

+0

Это блестяще ... спасибо. –

0
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(); 
    } 
} 


//////---------------------------///////////// 
1

Я знаю, что это приходит очень поздно, но он все еще может помочь кому-то

Пожалуйста, добавьте следующий код в 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); 
    } 

Удачи.