0

Я хочу реализовать кнопку up в приложении Android с одним действием, которое изменяет его содержимое на другой фрагмент. Я использовал активность навигационного ящика по умолчанию, предоставляемую студией Android, где я добавил frameLayout в content_main. В фрагменте, где я хочу вверх Боттон, чтобы показать я добавил эту строку кода в методе onCreateView:NavigationView actionaBar onOptionsItemSelected R.id.home not triggered

ActionBar actionBar = ((AppCompatActivity)getActivity()).getSupportActionBar(); 
actionBar.setDisplayHomeAsUpEnabled(true); 

объявление этой линии в OnCreate метод:

setHasOptionsMenu(true); 

и я добавил способ поймать щелчок этого:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getItemId() == android.R.id.home) { 
     Log.w("second fragment","clicked back"); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

в activiy я установил onCreateOptionsMenu как это:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

, но щелчок по нему не запускается. Я попытался добавить кнопку настройки, и она запускается. Я уже много читал об этом, но я не могу понять, как его решить.

ответ

-1

Попробуйте использовать оператор switch (...) case.

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    //this will make Hamburger button clickable. 
    if (mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 

    //this will make the HomeAsUpIndicator button clickable. 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      Log.w("second fragment","clicked back"); 
      break; 
    } 
    return super.onOptionsItemSelected(item); 
} 

Надеюсь, это вам поможет.

+0

уже пытался, но не работает – pool

+0

К сожалению, в моем случае весь onOptionsItemSelected не называется. – CoolMind

+0

Это не имеет никакого смысла. Почему коммутатор должен иметь какое-либо отношение к проблеме? –

0

setHasOptionsMenu(true) должен быть вызван в методе onCreate(), чтобы FragmentManager знал, что вашему фрагменту необходимо получить обратные вызовы меню параметров.

+0

Я сказал, что я забыл добавить в вопрос – pool

+0

Как вы реализуете 'onCreateOptionsMenu'? – li2

+0

Я добавил код в вопрос – pool

0

Я считаю, что вы используете this constructor для ActionBarDrawerToggle, который принимает параметр Toolbar. Если вы используете этот конструктор, onOptionsItemSelected не будет вызываться, если вы нажмете на индикатор. Есть вопросы/ответы по этой проблеме, например:

AppCompat v7 Toolbar onOptionsItemSelected not called

Но для меня, ни один из них не работал отлично, так что я использовал конструктор Toolbar-специфичны и здесь это обходной путь для моего случая. Я помещаю прозрачный вид поверх панели инструментов, которая «видима» только тогда, когда я показываю кнопку «Назад», и я сам обрабатываю щелчок (вызывая onBackPressed() в моем случае).

Я знаю, что это своего рода хак, но он нужен и работал для меня.

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:openDrawer="start"> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="@color/main_background"> 

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

       <android.support.v7.widget.Toolbar 
        android:id="@+id/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> 

      <FrameLayout 
       android:id="@+id/layoutMainContent" 
       android:layout_below="@id/appBar" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"/> 

     </RelativeLayout> 

     <!-- The important view --> 
     <View 
      android:id="@+id/viewFakeBack" 
      android:layout_width="56dp" 
      android:layout_height="56dp" 
      android:clickable="true" 
      android:visibility="gone"/> 

    </FrameLayout> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/navigationView" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:fitsSystemWindows="true" 
     app:menu="@menu/navigation_drawer"/> 

</android.support.v4.widget.DrawerLayout> 
+0

Спасибо, в конце я нашел другое обходное решение от различных вопрос, потому что и для меня, и для работы – pool