Кнопка «Назад» на панели инструментов не работает

У меня есть просто Activity, который является дочерним элементом класса ActionBarActivity. В методе, который я установил, OnCreate поддерживает панель инструментов. Для этого я переопределяю OnOptionsItemSelected, поэтому при нажатии кнопки «Назад» выполнялось какое-то действие

Код выглядит следующим образом:

    [Activity (Label = "SimplyActivity", Theme="@style/MyTheme")]           
        public class SimplyActivity : ActionBarActivity
        {
            private Toolbar toolbar;

            // ... OnCreate method
            this.toolbar = FindViewById<Toolbar>(Resource.Id.toolbar);
            SetSupportActionBar (this.toolbar);
            SupportActionBar.SetDisplayHomeAsUpEnabled (true);
            SupportActionBar.SetHomeButtonEnabled (true);

            public override bool OnOptionsItemSelected (IMenuItem item)
            {
                if (item.TitleFormatted == null) this.OnBackPressed ();
                return base.OnOptionsItemSelected (item);
            }

К сожалению, до тех пор, пока панель инструментов отображается правильно, это уже не реакция на обратное нажатие клавиш. Я бы добавил, что в других активностях (которые используют фрагменты) все работает корректно.

Помогите пожалуйста мне


person Jake    schedule 14.11.2015    source источник
comment
это уже не реакция на обратное нажатие клавиш. Клавиши - аппаратная кнопка Назад что ли?   -  person XTL    schedule 23.11.2015


Ответы (6)


Это должно работать так

public override bool OnOptionsItemSelected(IMenuItem item)
{
    //Back button pressed -> toggle event
    if (item.ItemId == Android.Resource.Id.Home)
        this.OnBackPressed(); 

    return base.OnOptionsItemSelected(item);
}
person leonard_deutsch    schedule 20.11.2015

Попробуйте что-то вроде этого:

Просто добавьте эти строки в свой метод OnCreate:

  SupportActionBar.SetDisplayHomeAsUpEnabled(true);

Затем переопределите метод OnOptionsItemSelected, как указано ниже.

public override bool OnOptionsItemSelected(IMenuItem item)
{
    if (item.ItemId != Android.Resource.Id.Home)
        return base.OnOptionsItemSelected(item);
    Finish();
    return true;
}
person Yksh    schedule 24.11.2015

попробуйте this.toolbar.setNavigationOnClickListener и заставьте его обрабатывать onBackPressed или popBackstack в соответствии с вашими потребностями.

person Justin Yang    schedule 14.11.2015
comment
Я пробовал это раньше, и это не работает. События не выполняются. - person Jake; 15.11.2015

Попробуйте сделать это:

[Activity (Label = "SimplyActivity", Theme="@style/MyTheme")]           
        public class SimplyActivity : ActionBarActivity
        {
            private Toolbar toolbar;
// ...
// OnCreate method
this.toolbar = FindViewById<Toolbar>(Resource.Id.toolbar);
SetSupportActionBar (this.toolbar);
            SupportActionBar.SetDisplayHomeAsUpEnabled (true);
            SupportActionBar.SetHomeButtonEnabled (true);
//dont forget this
            this.toolbar.SyncState();
this.toolbar += ClickedMenu;

public override bool OnOptionsItemSelected (IMenuItem item)
        {
            this.OnOptionsItemSelected(item);
            return base.OnOptionsItemSelected (item);
        }

 public void ClickedMenu(object sender,SupportToolbar.MenuItemClickEventArgs e)
        {
            switch (e.Item.ItemId)
            {     //your TitleFormatted ID
                case Resource.Id.action_edit:
                    //do stuff here
                this.OnBackPressed ();
                    break;
            }
        }
 protected override void OnPostCreate(Bundle savedInstanceState)
        {
            base.OnPostCreate(savedInstanceState);
            this.toolbar.SyncState();     
        }
person XTL    schedule 23.11.2015

Проблема оказалась действительно странной. Макет, который использовал панель действий, имел RelativeLayout. После изменения атрибута LinearLayout android:gravity="vertical" все работает корректно.

Спасибо всем за помощь

person Jake    schedule 26.11.2015

Я предлагаю вам использовать этот фрагмент кода, чтобы использовать пользовательскую кнопку «Назад» на панели инструментов:

Первый шаг: добавьте кнопку возврата значка в папку с возможностью рисования.

Второй шаг: добавьте панель инструментов в свой AppBarLayout следующим образом:

<android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/chart_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>

Третий шаг: в вашем onCreate найдите такие представления:

Toolbar toolbar = (Toolbar) findViewById(R.id.chart_toolbar);

4-й шаг: добавьте панель действий поддержки на панель инструментов:

setSupportActionBar(toolbar);

if (getSupportActionBar() != null) {
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

5-й шаг: добавьте значок желания на кнопку:

toolbar.setNavigationIcon(ContextCompat.getDrawable(getApplicationContext(), R.drawable.ic_chevron_left));

6-й шаг: установите прослушиватель кликов для кнопки «Назад»:

toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                NavUtils.navigateUpFromSameTask(Chart.this);
            }
});

и, наконец, переопределить методы oncreateoptionsmenu и onoptionsitemselected:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.my_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        return true;
    }
person mirjafarabedi    schedule 28.10.2016