Android Back Button在某些活动中起作用,在其他活动中起作用

时间:2014-10-22 15:07:51

标签: android-intent android-activity back-button-control

我希望有人可以帮我解决问题。 Android后退按钮适用于某些活动,而其他活动则会中断。我的MainActivity还有其他目标活动,具体取决于所选的选项。当我的应用程序管理地图时,当我单击标记的Infowindow时,它会根据需要转到详细活动,当我单击Android后退按钮时,它会正常返回主要活动(不要与操作栏中的主页按钮,我不想实现)。

但是当我点击“联系人”或“条款和条件”选项时,我打算以与infowindows相同的方式启动联系人/条款活动,它会像往常一样打开活动,但后面按钮不起作用,它看起来有点重新打开联系人/条款活动,不会返回主要活动。我搜索了很多帖子,并添加了我的观察结果:

  1. 我没有在MainActivity上调用finish(),所以我并没有故意搞乱活动堆栈。
  2. 我尝试将putExtra(“finishActivityOnSaveCompleted”,true)改为this post suggests,但没有运气。
  3. 我尝试过让两个活动都相同(详细信息和联系人活动),只显示一个简单的布局,而不是os.bundle,app.Activity,content.Intent,view.View和View.Window。 / LI>
  4. 我尝试触发startActivity()函数,该函数从覆盖某些函数的方法调用Contact Activity(细节Acvitity使用来自覆盖click事件的方法的startActivity调用)。
  5. 我尝试过将一些额外的数据从Main接收到Contact活动(这就是我的绝望程度)。
  6. 我的选项用完了,我无法弄清楚出了什么问题,我知道我不应该自己实现后退按钮功能,因为Android会为我处理它。 我正在我的清单中定位SDK版本16及更高版本,我添加了一个调用这两个活动的代码的简短版本:

    public class MainActivity extends FragmentActivity implements OnNavigationListener, ClusterManager.OnClusterClickListener<MyItem>, ClusterManager.OnClusterInfoWindowClickListener<MyItem>, ClusterManager.OnClusterItemClickListener<MyItem>, ClusterManager.OnClusterItemInfoWindowClickListener<MyItem>
    {
        .
        .
        .
        /*Some variables initialized*/
        .
        .
         protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            .
            .
            .
            gridView.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
                    menuOpt=position;
                    getData();
                    //gridView.setVisibility(View.GONE);
                    if(gridView.getVisibility() == View.VISIBLE) {
                        toggleView(gridView);
                    }
                }
            });
        }
        public void getData(){
            String optString="";
            llMatVesp.setVisibility(View.GONE);
            switch(menuOpt){
            /* In this case the back button to MainActivity works, I manage action bar operations for a particular behaviour of the menu, all options in the switch do */
            case 1:  
                actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
                actionBar.setCustomView(null);
                getResults(); 
                break;
            /* In this case the back button of Contact Activity, that's supposed to return to MainActivity doesn't work */
            case 2: 
                Intent conIntent=new Intent(MainActivity.this, Contact.class);  startActivity(conIntent);
                break;
            default:break;
            }
        }
        /*this function brings data from db, add markers to the map, and animates to a certain point
        public void getResults(){
            .
            .
        }
    
        /* This functions extract the right data from the marker and make the intent that starts the detail Activity, where the back button works with no problems */
        @Override
        public void onClusterItemInfoWindowClick(MyItem item) {
            showDetail(item.getId(),item.getMenuOpt());
        }
        public void showDetail(String id, int menuOpt){
            Intent showDetail=new Intent(MainActivity.this, ShowDetail.class);
            showDetail.putExtra("menuOpt", menuOpt);
            showDetail.putExtra("icon", ic);        
            showDetail.putExtra("id", id);
            startActivity(showDetail);
        }
    }
    

    联系活动有一个表单并发送电子邮件,但是后退按钮不起作用的另一个活动,TermsAndConditions活动,只显示一个简单的LinearLayout,就是这样,没有花哨的编码。

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方法,您只需要覆盖后退按钮默认操作,将用户发送到主要活动或您希望的任何其他操作,但如果您来自其他活动,则会丢失活动后退堆栈顺序。如果您的第二个活动使用webview,如果页面加载有错误,它将使用chrome引擎,在这种情况下,将这些标志添加到intent中,否则忽略该行。

    @Override
public void onBackPressed() {
    Intent intent = new Intent(SecondActivity.this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(intent);
    return;
}