【问题标题】:Finish activity when back button pressed once按下后退按钮后完成活动
【发布时间】:2018-05-28 07:41:31
【问题描述】:

在我的应用程序中,我遇到了这个问题,即只有在按下后退按钮两次时才会关闭活动(例如:Activity_B)。我希望在按下后退按钮一次时关闭 Activity_B,然后再显示 Activity_A。

我试过这段代码:

    public override void OnBackPressed()
    {
        base.OnBackPressed();
        //MoveTaskToBack(true);
        this.Finish();            
        Finish();
        FinishAndRemoveTask();
    }

但行为仍然相同。 我尝试放置调试器点并查看它的行为。 按下后退按钮时将调用 Activity_B。

启动Activity_B的代码是:

 private void OnDataLayout_Click(object sender, EventArgs e)
    {            
        Intent intent = new Intent(this, typeof(Activity_B));
        StartActivity(intent);
    }

非常感谢任何帮助。

Update1:​​我观察到 OnDataLayout_Click 事件也被调用了两次,在导航到 Activity_B 的 OnCreate() 后,OnCreate() 也被调用了两次。

【问题讨论】:

  • 哪个活动首先打开? Activity_AActivity_B
  • Activity_A 先打开,再打开 Activity_B。但是当我在 Activity_B 中按下返回按钮时,Activity_B 屏幕显示两次,然后它才导航回 Activity_A
  • 能否提供启动Activity_B的代码。
  • 更新了我的问题
  • 请尝试使用Activity_B.class 而非typeof(Activity_B) 打开新活动。

标签: android xamarin.android


【解决方案1】:

OnDataLayout_Click 事件也被调用了两次

如果你的Button的点击事件被绑定了两次,那么点击事件会被调用两次。

如下代码:

public class MainActivity : AppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);
        initView();

    }

    protected override void OnResume()
    {
        base.OnResume();
        initView();
    }
    private void initView()
    {
        Button bt = FindViewById<Button>(Resource.Id.bt);
        bt.Click += Bt_Click;
    }

    private void Bt_Click(object sender, System.EventArgs e)
    {
        Intent intent = new Intent(this, typeof(Activity1));
        StartActivity(intent);
    }
}

initView 方法被调用了两次,OnCreateOnResume 方法。这将导致您的问题。

但是,如果你使用SetOnClickListener方法,问题就会消失:

public class MainActivity : AppCompatActivity,View.IOnClickListener
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);
        initView();

    }

    protected override void OnResume()
    {
        base.OnResume();
        initView();
    }
    private void initView()
    {
        Button bt = FindViewById<Button>(Resource.Id.bt);
        bt.SetOnClickListener(this);
    }



    public void OnClick(View v)
    {
        Intent intent = new Intent(this, typeof(Activity1));
        StartActivity(intent);
    }
}

【讨论】:

    【解决方案2】:

    如果你想从Activity BonBackpressed回到Activity A,你不需要为backpressed编写任何代码,但是如果你想从Activity B退出Backprssed而不去Activity A那么你需要finish()它在Activity A();

    【讨论】: