【问题标题】:Android onBackPressed() not workingAndroid onBackPressed()不起作用
【发布时间】:2014-06-05 08:44:30
【问题描述】:

我正在尝试添加此功能:

-点击返回按钮时会弹出退出提示(AlertDialog with yes or no)

问题

但它不能正常工作。如果我点击按钮,它会直接退出程序。

这是我的整个活动代码:(我测试的退出函数在代码的末尾)

@SuppressWarnings("deprecation")
public class MainScreen extends TabActivity {
    // TabSpec Names
    private static final String Alerts_SPEC = "Alertes";
    private static final String Status_SPEC = "Status";
    private static final String Details_SPEC = "Events";

    @SuppressWarnings("deprecation")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_screen);

        TabHost tabHost = getTabHost();

        // Inbox Tab
        TabSpec alertsSpec = tabHost.newTabSpec(Alerts_SPEC);
        alertsSpec.setIndicator(Alerts_SPEC);
        Intent alertsIntent = new Intent(this, FragmentAlerts.class);
        alertsSpec.setContent(alertsIntent);

        // Outbox Tab
        TabSpec statusSpec = tabHost.newTabSpec(Status_SPEC);
        statusSpec.setIndicator(Status_SPEC);
        Intent statusIntent = new Intent(this, FragmentStatus.class);
        statusSpec.setContent(statusIntent);

        // Profile Tab
        TabSpec detailsSpec = tabHost.newTabSpec(Details_SPEC);
        detailsSpec.setIndicator(Details_SPEC);
        Intent detailsIntent = new Intent(this, FragmentEvents.class);
        detailsSpec.setContent(detailsIntent);


        // Adding all TabSpec to TabHost
        tabHost.addTab(alertsSpec); // Adding Inbox tab
        tabHost.addTab(statusSpec); // Adding Outbox tab
        tabHost.addTab(detailsSpec); // Adding Profile tab


    }

    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.activity_main_actions, menu);

        return super.onCreateOptionsMenu(menu);
    }

    /**
     * On selecting action bar icons
     * */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Take appropriate action for each action item click
        switch (item.getItemId()) {
        case R.id.action_refresh:
            // refresh
            finish();
            startActivity(getIntent());
            return true;
        case R.id.action_password:
            // help action
            Intent i = new Intent(getApplicationContext(), LoginActivityAdmin.class);
            startActivity(i);
            finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }
// -------------- EXIT CODE BEGINS ------------------------------

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event){ 

        if ((keyCode == KeyEvent.KEYCODE_BACK)) { //stop your music here
             // To exit application
            onBackPressed2();
        } 
        return super.onKeyDown(keyCode, event); 
    }

    public void onBackPressed2() {

        new AlertDialog.Builder(this)
               .setMessage("Are you sure you want to exit?")
               .setCancelable(false)
               .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                        MainScreen.this.finish();
                   }
               })
               .setNegativeButton("No", null)
               .show();

    }

}

解决方案

我将此代码添加到每个孩子:

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

然后在我的主要活动中调用它:

    @Override 
  public void onBackPressed() {

        new AlertDialog.Builder(this)
               .setMessage("Are you sure you want to exit?")
               .setCancelable(false)
               .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       MainScreen.this.finish();
                   }
               })
               .setNegativeButton("No", null)
               .show();

    }

【问题讨论】:

  • 为什么是 onBackPressed2 ?
  • 我可以随便命名它,但即使使用 onBackPressed 和 @override 也没有任何反应

标签: android


【解决方案1】:

从这个链接尝试一下:

Key Events in TabActivities?

每个选项卡的 Activity 都处理“后退”按下。

【讨论】:

  • 谢谢你,你救了我一命 =)
  • 我的答案可能会有一些已解决的标记吗? :)
  • done =) 顺便说一句,我在链接上找到了解决方案,所以删除 super.onBackPressed();
【解决方案2】:

我之前的回答错了,试试这个:

 /* you don't need this
 @Override 
public boolean onKeyDown(int keyCode, KeyEvent event){ 

    if ((keyCode == KeyEvent.KEYCODE_BACK)) { //stop your music here
         // To exit application
        onBackPressed();
    } 
    return super.onKeyDown(keyCode, event); 
} */

@Override
public void onBackPressed() {

    new AlertDialog.Builder(this)
           .setMessage("Are you sure you want to exit?")
           .setCancelable(false)
           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   onBackPressed2();
               }
           })
           .setNegativeButton("No", null)
           .show();

}

public void onBackPressed2()
{
    MainScreen.this.finish();
}

}

或执行以下操作:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event){ 

    if ((keyCode == KeyEvent.KEYCODE_BACK)) { //stop your music here
         // To exit application
        onBackPressed2();
        return true;
    } 
    else
    {
        return super.onKeyDown(keyCode, event); 
    }
}

【讨论】:

  • 我刚刚测试了这个,没有任何改变
  • 哦,我想我一开始误解了你的问题。我会修正我的答案。
  • 谢谢,但仍然没有任何反应,我正在使用 4.1.2 平台 API 19
  • 当什么都没发生时,你会得到警告对话框吗?还是单击“是”时什么也没有发生?
  • 测试了第二个,还是不行,我不明白为什么它不起作用,它的逻辑是正确的
【解决方案3】:

在处理按键事件时不要调用super.onKeyDown(keyCode, event);

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event){ 

    if ((keyCode == KeyEvent.KEYCODE_BACK)) { //stop your music here
         // To exit application
        onBackPressed2();
        return true; 
    } 
    return super.onKeyDown(keyCode, event); 
}

【讨论】:

  • 删除了那个并测试了纯 OnBackPressed() ,仍然没有
【解决方案4】:

您需要将 onBackPressed() 方法放在 FragmentAlerts.class 中。 MainActivity 由 TabActivity 扩展,因此默认调用会到达您的第一个选项卡。所以调用你的 onbacpress indside 第一个活动,即 FragmentAlerts。

【讨论】:

  • 为我在每个 Fragment 函数中添加 OnBackPressed() 解决了
  • 好。 TabActivity 仅当您想要执行任何关键事件然后在该特定 Activity 中实现它时才表示 Tabs 的声明。
猜你喜欢
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多