2014-02-02 2 views
10

Я использую ActionBarCompat. Когда я загружаю дочерний фрагмент, я хочу, чтобы кнопка «Дом» работала как кнопка «вверх». Поэтому я назвал это из детского фрагмента:Вызов setDisplayHomeAsUpEnabled для фрагментов в ActionBarCompat

((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

Но все же кнопка дома не отображается как кнопка вверх. Я также добавил логику для id android.R.id.home в onOptionsItemSelected, но он все еще не работает. Любые идеи, как я могу это сделать?

ответ

-2

Попробуйте это, также не забудьте упомянуть родительскую активность и мета-данные для деятельности в проявленном

public boolean onOptionsItemSelected(MenuItem item) { 

    if (item.getItemId() == android.R.id.home) { 

     Intent intent = NavUtils.getParentActivityIntent(this); 
     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     NavUtils.navigateUpTo(this, intent); 
     // NavUtils.navigateUpFromSameTask(this); 
     // finish(); 
     return true; 
    } else { 
     return super.onOptionsItemSelected(item); 
    } 
} 
+0

1. Вы не можете установить родительские действия в манифест для фрагмента. 2. Вопрос заключается не в том, как обрабатывать событие itemSelected, а в том, как изменить кнопку «вверх» в панели действий. –

7

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

В моей основной деятельности (той, которая запускает фрагмент), создайте следующую публичную функцию, которая будет вызываться дочерним фрагментом:

// The method is in MainActivity.java 
public void resetActionBar(boolean childAction, int drawerMode) 
{ 
    if (childAction) { 
     // [Undocumented?] trick to get up button icon to show 
     drawerToggle.setDrawerIndicatorEnabled(false); 
     mActionBar.setDisplayHomeAsUpEnabled(true); 
    } else { 
     drawerToggle.setDrawerIndicatorEnabled(true); 
    } 

    drawerLayout.setDrawerLockMode(drawerMode); 
} 

Затем из вашего фрагмента, который вы хотите, чтобы кнопка Up появляться, просто вызовите этот метод следующим образом (адаптация имен классов при необходимости):

// This method in in SomeFragment.java 
((MainActivity)getActivity()).resetActionBar(true, 
     DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 

Итак, вот как включить вверх кнопка из фрагмента:

  • Отключение индикатора ящика на объекте drawerToggle - вызов setDrawerIndicatorEnabled (ложь)
  • Set displayHomeAsUp - вызов setDisplayHomeAsUpEnable (истинный) на ActionBar объекта
  • Необязательно, запирать ящик, так что он не будет появляться по краю салфетке

Надеется, что это помогает, и я надеюсь, что это становится легче в будущем ...

+0

У меня была такая же проблема. Я попробовал вам решение. Теперь он показывает кнопку «Вверх», но событие click на кнопке UP ничего не делает. Я не отступаю. Я переопределяю 'onOptionsItemSelected' в фрагменте, но это ничего. Не могли бы вы мне помочь. – Dory

+0

Ты гений ....;) –

0

я сослалась на ответ и принять изменения, как это:

//add third parameter for Fragment 
    public void resetActionBar(boolean childAction, int drawerMode , final Fragment fragment) { 
     if (childAction) { 
      // [Undocumented?] trick to get up button icon to show 
      actionBarDrawerToggle.setDrawerIndicatorEnabled(false); 
      getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
      toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        FragmentManager manager = getSupportFragmentManager(); 
        FragmentTransaction transaction = manager.beginTransaction(); 
        transaction.replace(R.id.mainFrame, fragment); 
        transaction.commit(); 
       } 
      }); 
     } else { 
      actionBarDrawerToggle.setDrawerIndicatorEnabled(true); 
     } 
     drawerLayout.setDrawerLockMode(drawerMode); 
    } 

и я называю эту функцию в другом фрагменте, как это:

//new Homepage it's my one of fragments , you can pick up your destination 
    ((MainActivity) getActivity()).resetActionBar(true,DrawerLayout.LOCK_MODE_LOCKED_CLOSED,new HomePage()); 

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

0

Bit опоздал на вечеринку :)

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

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
       drawerFragment.mDrawerToggle.setDrawerIndicatorEnabled(false); 
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);// show back button 
       toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         onBackPressed(); 
        } 
       }); 
      } else { 
       //show hamburger 
       drawerFragment.mDrawerToggle.setDrawerIndicatorEnabled(true); 
       getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
       drawerFragment.mDrawerToggle.syncState(); 
       toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         drawerFragment.mDrawerLayout.openDrawer(GravityCompat.START); 
        } 
       }); 
      } 
     } 
    }); 
Смежные вопросы